January 26, 2009

парадокс Монти Хола

Сегодня долго спорили с Димкой про парадокс Монти Хола . Было решено написать программку.

Вот она на руби:


def game options = {:size => 10000, :with_change => true}
times_i_won = 0
options[:size].times do |index|
boxes = [:keys, :cabbage, :cabbage].sort_by { rand }
what_i_pick = boxes[rand(3)]
if options[:with_change]
times_i_won += 1 if what_i_pick == :cabbage
else
times_i_won += 1 if what_i_pick == :keys
end
end
times_i_won
end

size = 10000

puts "with change #{game :size => size, :with_change => true} times I won"
puts "without change #{game :size => size, :with_change => false} times I won"


output

with change 6692 times I won
without change 3310 times I won

Вот она на Java от Димы:

package dmitrygusev;

import java.util.Random;

public class Main {

public static void main(String[] args) {
Random winGenerator = new Random();
Random shotGenerator = new Random();

int losses = 0;
int wins = 0;

for (int n = 0; n < 10000; n++) {
int win = winGenerator.nextInt(3);

for (int i = 0; i < 3; i++) {
System.out.print((win == i ? 1 : 0) + "\t");
}

int shot = shotGenerator.nextInt(3);

System.out.print("shot = " + shot + "\t");

if (win == shot) {
losses++;
System.out.println("Loss");
} else {
wins++;
System.out.println("Win");
}
}

System.out.println("Losses = " + losses);
System.out.println("Wins = " + wins);
}

}

output

...
0 0 1 shot = 0 Win
0 0 1 shot = 0 Win
0 0 1 shot = 1 Win
0 1 0 shot = 0 Win
Losses = 3316
Wins = 6684

0 comments: