fork(1) download
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import java.util.Random;
  5. import java.util.stream.Collectors;
  6.  
  7. class MontyHallProblem
  8. {
  9. static final int DOORS_SIZE = 3;
  10. static final int REPETITIONS_NUMBER = 1000;
  11. static final Random random;
  12. static
  13. {
  14. random = new Random();
  15. }
  16. static class Door
  17. {
  18. boolean car;
  19. boolean firstChoiced;
  20. boolean opened;
  21. Door(boolean car)
  22. {
  23. this.car = car;
  24. firstChoiced = false;
  25. opened = false;
  26. }
  27. }
  28. static abstract class Player
  29. {
  30. int firstWonsNumber;
  31. int secondWonsNumber;
  32. Player()
  33. {
  34. firstWonsNumber = 0;
  35. secondWonsNumber = 0;
  36. }
  37. Door firstChoice(List<Door> doors)
  38. {
  39. final Door door = randomChoice(doors);
  40. door.firstChoiced = true;
  41. return door;
  42. }
  43. abstract Door secondChoice(List<Door> doors);
  44. }
  45. static class ImmutablePlayer extends Player
  46. {
  47. Door secondChoice(List<Door> doors)
  48. {
  49. return doors.stream()
  50. .filter(door -> door.firstChoiced)
  51. .findFirst()
  52. .get();
  53. }
  54. }
  55. static class MutablePlayer extends Player
  56. {
  57. Door secondChoice(List<Door> doors)
  58. {
  59. return randomChoice(doors.stream()
  60. .filter(door -> !door.opened)
  61. .collect(Collectors.toList()));
  62. }
  63. }
  64. static class Game
  65. {
  66. List<Door> doors;
  67. Game()
  68. {
  69. doors = new ArrayList();
  70. doors.add(new Door(true));
  71. while (doors.size() < DOORS_SIZE) doors.add(new Door(false));
  72. Collections.shuffle(doors);
  73. }
  74. void openAnother()
  75. {
  76. randomChoice(doors.stream()
  77. .filter(door -> !door.car && !door.firstChoiced)
  78. .collect(Collectors.toList())).opened = true;
  79. }
  80. void play(Player player)
  81. {
  82. if (player.firstChoice(doors).car) ++player.firstWonsNumber;
  83. openAnother();
  84. if (player.secondChoice(doors).car) ++player.secondWonsNumber;
  85. }
  86. }
  87. public static void main(String[] args)
  88. {
  89. final Player immutablePlayer = new ImmutablePlayer();
  90. repeat(immutablePlayer);
  91. System.out.printf
  92. (
  93. "Immutable first=%d second=%d\n",
  94. immutablePlayer.firstWonsNumber,
  95. immutablePlayer.secondWonsNumber
  96. );
  97. final Player mutablePlayer = new MutablePlayer();
  98. repeat(mutablePlayer);
  99. System.out.printf
  100. (
  101. "Mutable first=%d second=%d\n",
  102. mutablePlayer.firstWonsNumber,
  103. mutablePlayer.secondWonsNumber
  104. );
  105. }
  106. static <T> T randomChoice(List<T> list)
  107. {
  108. return list.get(random.nextInt(list.size()));
  109. }
  110. static void repeat(Player player)
  111. {
  112. for (int i = 0; i < REPETITIONS_NUMBER; ++i) new Game().play(player);
  113. }
  114. }
Success #stdin #stdout 0.13s 37336KB
stdin
Standard input is empty
stdout
Immutable first=353 second=353
Mutable first=361 second=456