2つの封筒問題 - バリエーションB をシミュレートするプログラムを書いてみた。なーんか違う気がするんですけどね。
import sys
import random
class Die:
def roll(self):
return random.randint(1, 6)
die = Die()
class Envelope:
def __init__(self):
r = die.roll()
n = 0
while r < 5:
n += r
r = die.roll()
self.values = (1 << n, 1 << (n + 1))
def open(self):
self.first_opend = die.roll() % 2
return self.values[self.first_opend]
def swap(self):
return self.values[not self.first_opend]
def experiment(t):
result = {}
for i in range(t):
e = Envelope()
v = e.open()
s = e.swap()
r = result.get(v, None)
if r is None:
r = [0, 0, 0] #occurence, none-swap case, swap case, respectivly
r[0] += 1
r[1] += v
r[2] += s
result[v] = r
return result
r = experiment(int(sys.argv[1]))
xs = [[i, r[i][0], r[i][1], r[i][2]] for i in r]
xs.sort(key=lambda x: x[0])
total = ['sum', 0, 0, 0]
for r in xs:
total[1] += r[1]
total[2] += r[2]
total[3] += r[3]
print r
print total
実行結果
[nori@shinano]~/Desktop/study/python/hack% python two2envelopes.py 1000
[1, 193, 193, 386]
[2, 185, 370, 269]
[4, 56, 224, 304]
[8, 52, 416, 496]
[16, 84, 1344, 1824]
[32, 72, 2304, 2304]
[64, 50, 3200, 4192]
[128, 59, 7552, 8000]
[256, 37, 9472, 12416]
[512, 21, 10752, 10752]
[1024, 31, 31744, 45056]
[2048, 21, 43008, 46080]
[4096, 13, 53248, 51200]
[8192, 26, 212992, 241664]
[16384, 16, 262144, 303104]
[32768, 11, 360448, 573440]
[65536, 9, 589824, 589824]
[131072, 13, 1703936, 2228224]
[262144, 8, 2097152, 1835008]
[524288, 4, 2097152, 2621440]
[1048576, 2, 2097152, 4194304]
[2097152, 5, 10485760, 14680064]
[4194304, 2, 8388608, 10485760]
[8388608, 6, 50331648, 62914560]
[16777216, 4, 67108864, 83886080]
[33554432, 2, 67108864, 134217728]
[67108864, 4, 268435456, 234881024]
[134217728, 2, 268435456, 536870912]
[268435456, 1, 268435456, 134217728]
[1073741824, 2, 2147483648, 1073741824]
[2147483648, 1, 2147483648, 4294967296]
[4294967296, 2, 8589934592, 10737418240]
[17179869184, 1, 17179869184, 34359738368]
[68719476736, 1, 68719476736, 34359738368]
[1099511627776, 1, 1099511627776, 549755813888]
[281474976710656, 2, 562949953421312, 703687441776640]
[2251799813685248, 1, 2251799813685248, 1125899906842624]
['sum', 1000, 2815949081296883, 1830223154961391]
0 件のコメント:
コメントを投稿