只是想了解生日悖論。 使用下面的代碼,我發現我需要平均12個樣本以獲得生日相撞。
不明白爲什麼它遠低於正常 23人得到一次生日碰撞的一半機會。 即使我使用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'。取其平均值不是碰撞的可能性。 –