誕生日のパラドックスを理解しようとしています。 次のコードを使用して、私は誕生日の衝突を得るために平均での12サンプルが必要だとわかりました。
普通の 23人が誕生日の衝突の1/2のチャンスを得るのはなぜか分かりません。 PyCryptoからStrongRandomを使用しても結果は変わりません。衝突のために必要なサンプル数(誕生日パラドックス)
from random import randint
from Crypto.Random.random import StrongRandom
EXPERIMENTS_NUM = 10000
SET_SIZE = 365
SUBSET = 23
where_collision_found = list()
rnd = StrongRandom()
for experiment in range(EXPERIMENTS_NUM):
for i in range(1,SET_SIZE + 2):
collision_found = False
#Generate a subset
# subset = [rnd.randint(1, SET_SIZE) for x in range(i)]
subset = [randint(1, SET_SIZE) for x in range(i)]
# Check for collision
flags = [False for x in range(SET_SIZE + 1)]
for k in range(i):
if flags[subset[k]]: #Collision found
collision_found = True
else:
flags[subset[k]] = True
if collision_found:
# print 'Collision found in set:', subset
break
where_collision_found.append(i)
print 'average collision:', sum(where_collision_found)/float(len(where_collision_found)), 'in', EXPERIMENTS_NUM, 'experiments'
結果:
average collision: 12.1277 in 10000 experiments
'where_collision_found'を合計することの意義は何ですか? –
ちょうど平均を得る: 'sum/count' – Sergey
' where_collision_found'は年の日です。衝突がなければ '366'です。その平均をとることは、衝突の確率ではありません。 –