2016-04-03 12 views
0

誕生日のパラドックスを理解しようとしています。 次のコードを使用して、私は誕生日の衝突を得るために平均での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

+0

'where_collision_found'を合計することの意義は何ですか? –

+0

ちょうど平均を得る: 'sum/count' – Sergey

+1

' where_collision_found'は年の日です。衝突がなければ '366'です。その平均をとることは、衝突の確率ではありません。 –

答えて

2

私はあなたのコードが何をしているかについて実際に明確ではありませんよ。ここで私はちょうど今やったことだ:

from random import randrange 
N = 365 
ns = [] 
for _ in range(10000): 
    n = 0 
    seen = set() 
    while True: 
     b = randrange(N) 
     n += 1 
     if b in seen: 
      break 
     seen.add(b) 
    ns.append(n) 
print(sum(ns)/float(len(ns))) 

し、出力をサンプル実行から:

24.6577 

これは良いです。あなたが期待している "23"は、分布の中央値です。平均(平均)は24.61659であると予想されます... https://en.wikipedia.org/wiki/Birthday_problem#Average_number_of_people

+0

明確な説明のおかげでありがたいですが、私はまだ〜24のものについて何も表示していないのがなぜなのでしょうか... – Sergey

+0

正直、あなたのコードが何を計算しているのか分かりません。あなたは、サブセット(本当にリスト - 置き換えられた選択肢)を、根本的な問題とは何の関係もなく、多くの特定のサイズが増えるように強制しています。修正が必要なコードではありません。問題のモデリングです。私が与えたコードは、問題の簡単なモデリングを示しています。また、あまりにも驚くべきことではなく、正しい*モデル*も結果が期待どおりであることを示しています。 –

+0

あなたの例では、反復の各サブセットは前のものに依存しています(新しい値を追加するだけなので)。私はそれがいくつかのセットからの無作為サンプリングの最善の方法ではないと思います。 私の例では、各繰り返しで新しいサブセットを生成し、これが何らかの形で結果に影響します。 私は本当に件名を勉強する必要があると思いますが、残念ながらどこで(wikipediaは役に立たなかったのですか)わからない – Sergey

関連する問題