Skip to content

Instantly share code, notes, and snippets.

@andruby
Created May 11, 2012 01:46
Show Gist options
  • Select an option

  • Save andruby/2656994 to your computer and use it in GitHub Desktop.

Select an option

Save andruby/2656994 to your computer and use it in GitHub Desktop.
Risk Simulation: Attacker or Defender advantage?
def game(attackers = 3, defenders = 2) # returns [attacker, defender] loses
attack = (1..attackers).map { rand(6) }.sort.reverse[0..1].reverse
defense = (1..defenders).map { rand(6) }.sort
max_wins = [attackers, defenders].min
attack_wins = (1..max_wins).map { attack.pop > defense.pop }.select{ |x| x}.count
[max_wins - attack_wins, attack_wins]
end
def full_game(armies = 30)
attack = defense = armies
while [attack-1, defense].min > 0
g = game([attack-1,3].min, [defense,2].min)
attack -= g.first
defense -= g.last
end
attack > defense ? 1 : 0 # 1 for attacker winning
end
def simulate(times, armies)
procent = ((1..times).map { full_game(armies) }.inject(&:+) / times.to_f) * 100
end
2.upto(50) { |armies| puts "For %2.0f armies: attacker winrate is %2.2f percent" % [armies, simulate(10_000, armies)] }
For 2 armies: attacker winrate is 10.47 percent
For 3 armies: attacker winrate is 20.22 percent
For 4 armies: attacker winrate is 32.04 percent
For 5 armies: attacker winrate is 35.99 percent
For 6 armies: attacker winrate is 39.22 percent
For 7 armies: attacker winrate is 41.48 percent
For 8 armies: attacker winrate is 45.43 percent
For 9 armies: attacker winrate is 46.31 percent
For 10 armies: attacker winrate is 49.10 percent
For 11 armies: attacker winrate is 50.56 percent
For 12 armies: attacker winrate is 50.80 percent
For 13 armies: attacker winrate is 52.32 percent
For 14 armies: attacker winrate is 51.69 percent
For 15 armies: attacker winrate is 53.73 percent
For 16 armies: attacker winrate is 55.68 percent
For 17 armies: attacker winrate is 55.26 percent
For 18 armies: attacker winrate is 56.54 percent
For 19 armies: attacker winrate is 57.27 percent
For 20 armies: attacker winrate is 57.54 percent
For 21 armies: attacker winrate is 58.20 percent
For 22 armies: attacker winrate is 58.91 percent
For 23 armies: attacker winrate is 60.65 percent
For 24 armies: attacker winrate is 60.44 percent
For 25 armies: attacker winrate is 60.84 percent
For 26 armies: attacker winrate is 61.43 percent
For 27 armies: attacker winrate is 62.10 percent
For 28 armies: attacker winrate is 62.91 percent
For 29 armies: attacker winrate is 63.09 percent
For 30 armies: attacker winrate is 62.68 percent
For 31 armies: attacker winrate is 63.19 percent
For 32 armies: attacker winrate is 63.66 percent
For 33 armies: attacker winrate is 64.36 percent
For 34 armies: attacker winrate is 65.49 percent
For 35 armies: attacker winrate is 64.88 percent
For 36 armies: attacker winrate is 65.83 percent
For 37 armies: attacker winrate is 66.16 percent
For 38 armies: attacker winrate is 66.39 percent
For 39 armies: attacker winrate is 67.22 percent
For 40 armies: attacker winrate is 67.10 percent
For 41 armies: attacker winrate is 67.95 percent
For 42 armies: attacker winrate is 68.28 percent
For 43 armies: attacker winrate is 67.49 percent
For 44 armies: attacker winrate is 68.88 percent
For 45 armies: attacker winrate is 68.75 percent
For 46 armies: attacker winrate is 68.78 percent
For 47 armies: attacker winrate is 69.36 percent
For 48 armies: attacker winrate is 69.62 percent
For 49 armies: attacker winrate is 70.50 percent
For 50 armies: attacker winrate is 71.22 percent
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment