May 17th, 2016 by depesz | Tags: , , , , | No comments »
Did it help? If yes - maybe you can help me?

I happen to play Zombicide. It's cooperative board game set in some kind of post-apocalyptic, zombie-infested, world.

Despite the general theme, lots of people like it, so we play it quite a lot.

One thing that bugged us, was : in given scenario, which weapon it's best to use?

Weapons in zombicide work by providing 2 numbers: how many die you have to roll, and what is the minimum score on a dice to count for a hit.

For example, you can have “nailbat", which uses 2 die, and hit is counted for each die from the roll that generated 3 or more.

So, I can have 0 hits, 1 hit, or 2 hits (naturally, I can't have more hits than I rolled die).

Then there are weapons like chainsaw, which use 5 die, but hit is counted from 5 on a dice.

The question is – assuming I am attacking (for example) 2 zombies – is it better to use nailbat, or chainsaw? Nailbat has 66% chance of hitting with each dice, but on the other hand chainsaw uses more die, so perhaps it evens out?

In this particular case, it's better to use chainsaw. Nailbat has 44.44% of chance of generating two hits, and chainsaw gives me over 53% of chances that I will get 2 (or more) hits, thus killing those two zombies.

But how to calculate it? And what about more complex cases, like rolling 12 die?

After quite a long research, lots of frustration, I got help from a guy on irc.

With him, I read parts of Binominal distribution (on wikipedia), and then was able to write this:

#!/usr/bin/env ruby
# encoding: utf-8
 
def factorial (n)
  if n<=1
    1
  else
    n * factorial(n-1)
  end
end
 
def probability(dice, kills_from, monsters)
  hit_probability = (7.0 - kills_from.to_f ) / 6.to_f;
  result = 0
 
  monsters.upto(dice) do | actual_monsters |
    part_a = factorial(dice).to_f / ( factorial(actual_monsters).to_f * factorial( dice - actual_monsters ).to_f )
    part_b = hit_probability.to_f ** actual_monsters.to_f
    part_c = ( 1.0 - hit_probability) ** (dice - actual_monsters)
    result += part_a * part_b * part_c
  end
  result
end
 
2.upto(6) do |kills_from|
  puts "Weapon kills from #{kills_from}"
  1.upto(20) do |dice|
    printf '* %2d %-4s: ', dice, dice > 1 ? "die" : "dice"
    1.upto(dice) do |monsters|
      printf "%2d+: %5.2f ; ", monsters, (probability( dice, kills_from, monsters ) * 10000).floor.to_f / 100
    end
    puts
  end
end

It probably can be optimized, and/or made nicer, but the fact is that it generates all statistics for up to 20 die in 0.04s. Fast enough.

And if you'd need these statistics:

Weapon kills from 2:

dice # kill count
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 83.33%
2 97.22% 69.44%
3 99.53% 92.59% 57.87%
4 99.92% 98.37% 86.80% 48.22%
5 99.98% 99.66% 96.45% 80.37% 40.18%
6 99.99% 99.93% 99.12% 93.77% 73.67% 33.48%
7 99.99% 99.98% 99.79% 98.23% 90.42% 66.97% 27.90%
8 99.99% 99.99% 99.95% 99.53% 96.93% 86.51% 60.46% 23.25%
9 99.99% 99.99% 99.99% 99.88% 99.10% 95.19% 82.17% 54.26% 19.38%
10 99.99% 99.99% 99.99% 99.97% 99.75% 98.45% 93.02% 77.52% 48.45% 16.15%
11 99.99% 99.99% 99.99% 99.99% 99.93% 99.53% 97.54% 90.44% 72.67% 43.06% 13.45%
12 99.99% 99.99% 99.99% 99.99% 99.98% 99.87% 99.20% 96.36% 87.48% 67.74% 38.13% 11.21%
13 99.99% 99.99% 99.99% 99.99% 99.99% 99.96% 99.76% 98.73% 94.88% 84.19% 62.80% 33.64% 9.34%
14 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.93% 99.58% 98.09% 93.10% 80.62% 57.94% 29.59% 7.78%
15 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.98% 99.87% 99.33% 97.26% 91.02% 76.84% 53.22% 25.96% 6.49%
16 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.96% 99.78% 98.99% 96.22% 88.66% 72.91% 48.67% 22.71% 5.40%
17 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.98% 99.93% 99.65% 98.53% 94.96% 86.03% 68.87% 44.35% 19.83% 4.50%
18 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.98% 99.88% 99.46% 97.93% 93.47% 83.17% 64.78% 40.26% 17.27% 3.75%
19 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.96% 99.81% 99.21% 97.19% 91.75% 80.11% 60.69% 36.43% 15.02% 3.13%
20 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.99% 99.98% 99.94% 99.71% 98.87% 96.28% 89.81% 76.87% 56.65% 32.86% 13.04% 2.60%

Weapon kills from 3:

dice # kill count
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 66.66%
2 88.88% 44.44%
3 96.29% 74.07% 29.62%
4 98.76% 88.88% 59.25% 19.75%
5 99.58% 95.47% 79.01% 46.09% 13.16%
6 99.86% 98.21% 89.98% 68.03% 35.11% 8.77%
7 99.95% 99.31% 95.47% 82.67% 57.06% 26.33% 5.85%
8 99.98% 99.74% 98.03% 91.20% 74.13% 46.82% 19.50% 3.90%
9 99.99% 99.90% 99.17% 95.75% 85.51% 65.03% 37.71% 14.30% 2.60%
10 99.99% 99.96% 99.65% 98.03% 92.34% 78.68% 55.92% 29.91% 10.40% 1.73%
11 99.99% 99.98% 99.86% 99.11% 96.13% 87.79% 71.10% 47.25% 23.41% 7.51% 1.15%
12 99.99% 99.99% 99.94% 99.61% 98.12% 93.35% 82.22% 63.15% 39.30% 18.11% 5.39% 0.77%
13 99.99% 99.99% 99.97% 99.83% 99.11% 96.53% 89.64% 75.86% 55.20% 32.24% 13.87% 3.85% 0.51%
14 99.99% 99.99% 99.99% 99.93% 99.59% 98.25% 94.23% 85.05% 68.98% 47.55% 26.11% 10.53% 2.74% 0.34%
15 99.99% 99.99% 99.99% 99.97% 99.81% 99.14% 96.91% 91.17% 79.69% 61.83% 40.40% 20.92% 7.93% 1.94% 0.22%
16 99.99% 99.99% 99.99% 99.98% 99.92% 99.59% 98.40% 95.00% 87.34% 73.74% 54.69% 33.91% 16.59% 5.93% 1.37% 0.15%
17 99.99% 99.99% 99.99% 99.99% 99.96% 99.81% 99.19% 97.27% 92.45% 82.81% 67.39% 47.76% 28.13% 13.04% 4.41% 0.96% 0.10%
18 99.99% 99.99% 99.99% 99.99% 99.98% 99.91% 99.60% 98.55% 95.66% 89.23% 77.67% 60.85% 41.22% 23.10% 10.16% 3.26% 0.67% 0.06%
19 99.99% 99.99% 99.99% 99.99% 99.99% 99.96% 99.81% 99.25% 97.59% 93.52% 85.38% 72.06% 54.30% 35.18% 18.79% 7.86% 2.40% 0.47% 0.04%
20 99.99% 99.99% 99.99% 99.99% 99.99% 99.98% 99.91% 99.62% 98.70% 96.23% 90.81% 80.94% 66.14% 47.93% 29.72% 15.15% 6.04% 1.75% 0.33% 0.03%

Weapon kills from 4:

dice # kill count
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 50.00%
2 75.00% 25.00%
3 87.50% 50.00% 12.50%
4 93.75% 68.75% 31.25% 6.25%
5 96.87% 81.25% 50.00% 18.75% 3.12%
6 98.43% 89.06% 65.62% 34.37% 10.93% 1.56%
7 99.21% 93.75% 77.34% 50.00% 22.65% 6.25% 0.78%
8 99.60% 96.48% 85.54% 63.67% 36.32% 14.45% 3.51% 0.39%
9 99.80% 98.04% 91.01% 74.60% 50.00% 25.39% 8.98% 1.95% 0.19%
10 99.90% 98.92% 94.53% 82.81% 62.30% 37.69% 17.18% 5.46% 1.07% 0.09%
11 99.95% 99.41% 96.72% 88.67% 72.55% 50.00% 27.44% 11.32% 3.27% 0.58% 0.04%
12 99.97% 99.68% 98.07% 92.70% 80.61% 61.27% 38.72% 19.38% 7.29% 1.92% 0.31% 0.02%
13 99.98% 99.82% 98.87% 95.38% 86.65% 70.94% 50.00% 29.05% 13.34% 4.61% 1.12% 0.17% 0.01%
14 99.99% 99.90% 99.35% 97.13% 91.02% 78.80% 60.47% 39.52% 21.19% 8.97% 2.86% 0.64% 0.09%
15 99.99% 99.95% 99.63% 98.24% 94.07% 84.91% 69.63% 50.00% 30.36% 15.08% 5.92% 1.75% 0.36% 0.04%
16 99.99% 99.97% 99.79% 98.93% 96.15% 89.49% 77.27% 59.81% 40.18% 22.72% 10.50% 3.84% 1.06% 0.20% 0.02%
17 99.99% 99.98% 99.88% 99.36% 97.54% 92.82% 83.38% 68.54% 50.00% 31.45% 16.61% 7.17% 2.45% 0.63% 0.11% 0.01%
18 99.99% 99.99% 99.93% 99.62% 98.45% 95.18% 88.10% 75.96% 59.27% 40.72% 24.03% 11.89% 4.81% 1.54% 0.37% 0.06%
19 99.99% 99.99% 99.96% 99.77% 99.03% 96.82% 91.64% 82.03% 67.61% 50.00% 32.38% 17.96% 8.35% 3.17% 0.96% 0.22% 0.03%
20 99.99% 99.99% 99.97% 99.87% 99.40% 97.93% 94.23% 86.84% 74.82% 58.80% 41.19% 25.17% 13.15% 5.76% 2.06% 0.59% 0.12% 0.02%

Weapon kills from 5:

dice # kill count
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 33.33%
2 55.55% 11.11%
3 70.37% 25.92% 3.70%
4 80.24% 40.74% 11.11% 1.23%
5 86.83% 53.90% 20.98% 4.52% 0.41%
6 91.22% 64.88% 31.96% 10.01% 1.78% 0.13%
7 94.14% 73.66% 42.93% 17.32% 4.52% 0.68% 0.04%
8 96.09% 80.49% 53.17% 25.86% 8.79% 1.96% 0.25% 0.01%
9 97.39% 85.69% 62.28% 34.96% 14.48% 4.24% 0.82% 0.09%
10 98.26% 89.59% 70.08% 44.07% 21.31% 7.65% 1.96% 0.34% 0.03%
11 98.84% 92.48% 76.58% 52.74% 28.89% 12.20% 3.86% 0.88% 0.13% 0.01%
12 99.22% 94.60% 81.88% 60.69% 36.84% 17.77% 6.64% 1.87% 0.38% 0.05%
13 99.48% 96.14% 86.12% 67.75% 44.79% 24.13% 10.35% 3.46% 0.88% 0.16% 0.02%
14 99.65% 97.25% 89.46% 73.88% 52.44% 31.01% 14.94% 5.76% 1.74% 0.40% 0.06%
15 99.77% 98.05% 92.06% 79.07% 59.59% 38.16% 20.30% 8.82% 3.08% 0.85% 0.18% 0.02%
16 99.84% 98.62% 94.06% 83.40% 66.08% 45.30% 26.25% 12.65% 4.99% 1.59% 0.40% 0.07% 0.01%
17 99.89% 99.03% 95.58% 86.95% 71.86% 52.23% 32.60% 17.18% 7.54% 2.72% 0.80% 0.18% 0.03%
18 99.93% 99.32% 96.73% 89.83% 76.89% 58.77% 39.14% 22.32% 10.76% 4.33% 1.44% 0.39% 0.08% 0.01%
19 99.95% 99.52% 97.59% 92.13% 81.20% 64.81% 45.69% 27.93% 14.61% 6.47% 2.40% 0.74% 0.18% 0.03%
20 99.96% 99.66% 98.24% 93.95% 84.84% 70.27% 52.06% 33.85% 19.05% 9.18% 3.76% 1.29% 0.37% 0.08% 0.01%

Weapon kills from 6:

dice # kill count
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 16.66%
2 30.55% 2.77%
3 42.12% 7.40% 0.46%
4 51.77% 13.19% 1.62% 0.07%
5 59.81% 19.62% 3.54% 0.33% 0.01%
6 66.51% 26.32% 6.22% 0.87% 0.06%
7 72.09% 33.02% 9.57% 1.76% 0.20% 0.01%
8 76.74% 39.53% 13.48% 3.06% 0.46% 0.04%
9 80.61% 45.73% 17.82% 4.80% 0.89% 0.11%
10 83.84% 51.54% 22.47% 6.97% 1.54% 0.24% 0.02%
11 86.54% 56.93% 27.32% 9.55% 2.45% 0.46% 0.06%
12 88.78% 61.86% 32.25% 12.51% 3.63% 0.79% 0.12% 0.01%
13 90.65% 66.35% 37.19% 15.80% 5.11% 1.26% 0.23% 0.03%
14 92.21% 70.40% 42.05% 19.37% 6.89% 1.90% 0.41% 0.06%
15 93.50% 74.03% 46.77% 23.15% 8.97% 2.73% 0.66% 0.12% 0.01%
16 94.59% 77.28% 51.32% 27.08% 11.33% 3.77% 1.00% 0.21% 0.03%
17 95.49% 80.16% 55.64% 31.12% 13.96% 5.03% 1.46% 0.34% 0.06% 0.01%
18 96.24% 82.72% 59.73% 35.21% 16.82% 6.52% 2.06% 0.53% 0.11% 0.01%
19 96.86% 84.97% 63.56% 39.30% 19.88% 8.24% 2.80% 0.78% 0.18% 0.03%
20 97.39% 86.95% 67.13% 43.34% 23.12% 10.18% 3.71% 1.12% 0.28% 0.05% 0.01%

Leave a comment