51 lines
954 B
Text
51 lines
954 B
Text
global drawer[] sampler[] .
|
|
proc init .
|
|
for i = 1 to 100
|
|
drawer[] &= i
|
|
sampler[] &= i
|
|
.
|
|
.
|
|
init
|
|
proc shuffle_drawer .
|
|
for i = len drawer[] downto 2
|
|
r = random 1 i
|
|
swap drawer[r] drawer[i]
|
|
.
|
|
.
|
|
func play_random .
|
|
shuffle_drawer
|
|
for prisoner = 1 to 100
|
|
for i = 1 to 50
|
|
r = random 1 (100 - i + 1)
|
|
card = drawer[sampler[r]]
|
|
swap sampler[r] sampler[100 - i + 1]
|
|
if card = prisoner : break 1
|
|
.
|
|
if i > 50 : return 0
|
|
.
|
|
return 1
|
|
.
|
|
func play_optimal .
|
|
shuffle_drawer
|
|
for prisoner = 1 to 100
|
|
reveal = prisoner
|
|
for i = 1 to 50
|
|
card = drawer[reveal]
|
|
if card = prisoner : break 1
|
|
reveal = card
|
|
.
|
|
if i > 50 : return 0
|
|
.
|
|
return 1
|
|
.
|
|
n = 100000
|
|
for i to n
|
|
win += play_random
|
|
.
|
|
print "random: " & 100.0 * win / n & "%"
|
|
#
|
|
win = 0
|
|
for i to n
|
|
win += play_optimal
|
|
.
|
|
print "optimal: " & 100.0 * win / n & "%"
|