質問

かったのでこの試験は、乱数の発生源のrandint:

>>> from random import randint
>>>
>>> uniques = []
>>> for i in range(4500):  # You can see I was optimistic.
...     x = randint(500, 5000)
...     if x in uniques:
...         raise Exception('We duped %d at iteration number %d' % (x, i))
...     uniques.append(x)
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
Exception: We duped 887 at iteration number 7

また約10倍以上の結果かった121反復前のリピーター.このような結果だから標準のですか?

役に立ちましたか?

解決

誕生日パラドックス、なぜPRNGsを複くれる方も多いと思います。


カップルの問題で、OPの問題です。ひとつは、 誕生日パラドックス としては、上記の自然がどのようにして生成しない本質的に保証する指数が繰り返されないようにすること.

誕生日パラドックスに適用される指定された値で生回以上の期間中に発生器ることができ、結果としての重複をできるようになサンプル内での値です。の効果の誕生日パラドックスが現実の可能性のような複製を行うだけでなくマンツーマンの平均期間より小さくもない。この移との間に的確率の誕生日パラドックスとも呼ばれ 認知バイアス, がナイーブを直観的に見積りのきの激しい間違っています。

ップ擬似乱数生成器(PRNGs)

最初の問題である可能性があり、露出値の乱数発生器に変換するかに低い番号のスペースの値は低減します。一部の 擬似乱数ジェネレータは、 な繰り返す値の期間に、この変換の変化ドメインのような時代になります。小さなドメインを無効にな繰り返しの状態が期待できな可能性を繰り返します。

一部のアルゴリズムなどの 線形合同PRNG (A'=AX|M) 一意性を保証をします。にLCG、生成された値を含む全国のアキュムレータの追加状態で開催されます。に発電機を確定できないリピート数内の任意のアキュムレータの値を示唆するだけで連続値です。そのため、それぞれの値のみが回期間内に機能します。ただし、期間などPRNGは比較的小型-約2^30のための典型的な実装のLCGアルゴリズムとのできるものではありませんより大きな数の異なる値です。

なPRNGアルゴリズムと共に、この特性;一部で繰り返し、指定された値以内の期間です。のOPの問題の メルセンヌツイスター アルゴリズム用のPythonの ランダム モジュールは非常に長い期間に比べ2^32.とは異なり、線形合同PRNGの結果ではない純粋な機能の前の出力値として、アキュムレーター追加。32ビット整数の出力期間~2^19937でできるものではありませんを提供などを保証するものではあ

のメルセンヌツイスターが人気のアルゴリズムPRNGsで良い統計的幾何学的性質と非常に長い期間に-望ましい特性をPRNG用シミュレーションモデルです。

  • 良い 統計的性質 その番号に発生するアルゴリズムが均一に分散されない番号を持つよりもはるかに高い確率で出現しています。貧しい統計的性質を作り出すことのできる不要なスキューの結果.

  • 良い 幾何学的精密 このセットのN番号なと超平面はN次元空間です。貧しい幾何学的性質を生成できるcf.擬似相関シミュレーションモデルを歪めます。

  • 長期間の手形を生成することができます多くの番号の前に列をラップ回りをしていきたいと思っています。合モデルのニーズを多数繰り返していますが、これからの数種の2^30離散数から代表的なLCG実施にあたり十分です。のMT19337アルゴリズムは非常に長い期間-2^19337-1の約10^5821.による比較で、総数の原子に宇宙の推定で約10^80.

の32ビット整数されたコードを生成するためにMT19337PRNGできるものではありませんを表すのに十分な離散値を繰り返しを避ける時のような大きな期間です。この場合は、複製値が発生することがあります避けるためには、十分なサンプルです。

誕生日パラドックスと言えば、一口に言えば

この問題そのものの定義として適切な二人のお部屋に同じ誕生日。のステークホルダーの 他の 人のルームシェアします。人naively誤解の問題としての確率い客室での共有誕生日など特定の個人の源泉である、 認知バイアス その原因のひとつである人々を過小評価しています。ここは正しくない前提のもとでは、この要件に合致する特定の個人や二人が戦いました。

This graph shows the probability of a shared birthday as the number of people in the room increases.  For 23 people the probability of two sharing a birthday is just over 50%.

確率の試合を起こした二人よりもはるかに高い確率の試合に特定の個人としての試合なのである必要はありません特定の日です。むしろ、みを個人が同じ誕生日。このグラフすることができたのWikipediaページ目)までにおいてのみ行われるように必要23人のルームが50%の二つに一致する。

から Wikipediaの すことが可能です 素敵なるものとする。 のOPの問題を4,500可能'の誕生日ではなく、365.指定された乱数の数値の発生等化に"people(人材)"という)をお知りになりたいの確率で 他の 二つの同一の値をも登場内のシーケンスです。

計算の影の誕生日パラドックスのOPの問題

のためのシーケンス番号100ていま (100 * 99) / 2 = 4950 対照 理解の問題)ことが可能な試合(最初となった、第二、第三等 第二にこの試合第四等なので、数 組み合わせ ことが可能な試合はより100です。

から 算定の確率 した発現 1 - (4500! / (4500**100 * (4500 - 100)!) .以下のスニペットのPythonコードを以下になナイーブな評価を確率マッチング-ペアすることができました。

# === birthday.py ===========================================
#
from math import log10, factorial

PV=4500          # Number of possible values
SS=100           # Sample size

# These intermediate results are exceedingly large numbers;
# Python automatically starts using bignums behind the scenes.
#
numerator = factorial (PV)          
denominator = (PV ** SS) * factorial (PV - SS)

# Now we need to get from bignums to floats without intermediate
# values too large to cast into a double.  Taking the logs and 
# subtracting them is equivalent to division.
#  
log_prob_no_pair = log10 (numerator) - log10 (denominator)

# We've just calculated the log of the probability that *NO*
# two matching pairs occur in the sample.  The probability
# of at least one collision is 1.0 - the probability that no 
# matching pairs exist.
#
print 1.0 - (10 ** log_prob_no_pair)

この良識ある見た結果、 p=0.669 一致の発生100番号から抽出した人口4500可能な値です。も誰かを確認できることコメントを投稿したいコンテンの場合は悪い)。ここからになることがわかります。長とのマッチング数値観のOPうかなりリーズナブル。

脚注:をシャッフリングを独自の配列が擬似乱数

この答えを下から見マーク のための確かな設定ランダムます。その技術のポスターとの間の配列番号(で供給することができるのでしなやshufflesし順序はランダムです。図の番号順にからのシャッフル配列までの配列が擬似乱数を保証されない繰り返す。

脚注:暗号法論的には安全PRNGs

のアルゴリズムではない 暗号法論的には確保 では比較的容易に推定の内部状態を発生装置による観測のシーケンス番号その他のアルゴリズムなど Blum Blum Shub 用いる暗号アプリケーションでうまく適さないシミュレーションや一般的な乱数願います。暗号法論的には安全PRNGs費用がかかることがありう必要bignum計算にはない幾何学的性質.の場合はこのタイプのアルゴリズムは、次の要件はすべきであると計算困難を推定できる内部状態を発生装置による観察における配列の値です。

他のヒント

はPythonを非難する前に、あなたは本当にいくつかの確率と統計理論をブラッシュアップする必要があります。 誕生日のパラドックスする

について読むことから始め

ところで、Pythonでrandomモジュールが考えられるメルセンヌツイスターのPRNGを使用し非常に良い、莫大な時間を持っており、広範囲にテストしました。だから、あなたが良い手にしているので安心しています。

あなたがrepetativeものをしたくない場合は、

は、シーケンシャルな配列を生成し、ランダム使用しています。シャッフルする

Nimbuzの答えへの答えとして:

http://xkcd.com/221/する

altテキスト

可能な値のセット全体が排出される前に

真のランダム性は間違いなく値の繰り返しが含まれています。あなたは値が繰り返されないだろうどのくらいのために予測することができるだろうように、それは、そうでない場合はランダムではありません。

あなたはサイコロをロールバックした場合、あなたは確かにかなり頻繁に行に3つのシックスだ...

それは、リピータではありません。あなたがのシーケンスの同じことを繰り返したときにリピーターです。 1つだけでなく多数ます。

あなたは、範囲4500から500 <= x <= 5000乱数を生成しています。あなたはそれが前に生成されているかどうかを各番号に確認してください。これらの数字の2が与えられたnを一致させるために確率が何であるかを教えてくれるの誕生日の問題が出しようとしますレンジdます。

することもできますが、重複が発生する可能性が50%以上になるまで生成する必要がどのように多くの数字を計算する式反転。この場合、あなたは>50%反復した後、重複する番号を見つけるの79のチャンスがあります。

いて定義されるランダムスペースの4501値500-5000)、繰り返し処理4500ます。す基本的に保証に衝突試験に書いた.

考えるので他の方法:

  • が、結果の配列は空のP(惑わ)=0
  • 1価値を配列P(惑わ)=1/4500
  • 2つの値の配列P(惑わ)=2/4500
  • など。

までの時間を取得します45/4500、その挿入は1%のチャンスが重複したことになる確率が上昇するそれ以降をサポートしていません。

を試験する試験、能力のランダム関数を増や宇宙のランダム値(例:500-500000きれないし、しないかもしれませんか惑わ.がいかに繰り返します。

この問題で他の誰のために、私は(uuid.uuid4使用)と、それは魔法のように動作します。

誕生日のパラドックスがあります。これを考慮して、あなたは何を言っていることは、「764、3875、4290、4378、764」またはその反復配列内の番号ので非常にランダムではないというようなものを見つけることであることを認識しています。それを行うための真の方法は、互いに配列を比較することです。私はこれを行うにはPythonスクリプトを書いています。

from random import randint
y = 21533456
uniques = []
for i in range(y):  
    x1 = str(randint(500, 5000))
    x2 = str(randint(500, 5000))
    x3 = str(randint(500, 5000))
    x4 = str(randint(500, 5000))
    x = (x1 + ", " + x2 + ", " + x3 + ", " + x4)
if x in uniques:
    raise Exception('We duped the sequence %d at iteration number %d' % (x, i))
else:
    raise Exception('Couldn\'t find a repeating sequence in %d iterations' % (y))
uniques.append(x)
scroll top