Calculating Probabilities in Mafia Party Game

  • Context: Undergrad 
  • Thread starter Thread starter Gerenuk
  • Start date Start date
  • Tags Tags
    Probabilities
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
1 reply · 2K views
Gerenuk
Messages
1,027
Reaction score
5
Does anyone know the game
http://en.wikipedia.org/wiki/Mafia_(party_game)
?

I was trying to calculate probabilities with the assumptions that all players are dumb and slay a random person at day. Basically every night one of the good people dies and then a random one of the rest dies. So I wrote down (g=good, b=bad)
P(g,b)=(g-1)/(g+b-1)*P(g-2,b)+b/(g+b-1)*P(g-1,b-1)
P(g<=b)=0
P(b=0)=1
for the probability that the good people win.

Now I was surprised about the non-monotonicity. In my calculations it seems for example
P(g=4,b=1)>P(g=5,b=1)

Have I missed something out? Why does it depend on odd/even so much?
By this calculations werewolves should sometime be decreased if the number of players is increased?
 
Physics news on Phys.org
I don't understand what happens if it arrives at 1 of each on a day slot (either would have to be very dumb indeed to vote to chop himself), but assuming they draw lots the lack of monotonicity is real.

E.g. it may be surprising that starting with a day slot the goodies do better to have one goody v one baddy than two goodies v one baddy but if you think about it it's right.

I append a javascript. (To run paste into a .htm file and drop it into a browser. Set the range values to lowest and highest numbers of players for the two sides.) The first number shown is the goodies and the 'n' or 'd' represents night or day start.

<script>

range=[1,9]

function p(g,b,n){
if(g<0||b<0||(b==0&&g==0))return NaN
if(b==0)return 1
if(b>g)return 0
if(n)return p(g-1,b)
else return (g*p(g-1,b,1)+b*p(g,b-1,1))/(b+g)
}

for(k=0;k<2;k++)
for(i=range[0];i<=range[1];i++)
for(j=i;j<=range[1];j++)
document.writeln('('+j+','+i+','+(k?'n':'d')+') '+p(j,i,k).toFixed(3)+'<br>')

</script>
 
Last edited: