質問

10個のintのリストについては、10があります!可能な順序または順列。なぜ唯一の5000回の試行後にrandom.shuffle所与の重複していますか?

>>> L = range(10)
>>> rL = list()
>>> for i in range(5000):
...     random.shuffle(L)
...     rL.append(L[:])
... 
>>> rL = [tuple(e) for e in rL]
>>> len(set(rL))
4997
>>> for i,t in enumerate(rL):
...     if rL.count(t) > 1:
...         print i,t
... 
102 (7, 5, 2, 4, 0, 6, 9, 3, 1, 8)
258 (1, 4, 0, 2, 7, 3, 5, 9, 6, 8)
892 (1, 4, 0, 2, 7, 3, 5, 9, 6, 8)
2878 (7, 5, 2, 4, 0, 6, 9, 3, 1, 8)
4123 (5, 8, 0, 1, 7, 3, 2, 4, 6, 9)
4633 (5, 8, 0, 1, 7, 3, 2, 4, 6, 9)
>>> 10*9*8*7*6*5*4*3*2
3628800
>>> 2**19937 - 1
431542479738816264805523551633791983905393 [snip]

>>> L = list()
>>> for i in range(5000):
...     L.append(random.choice(xrange(3628800)))
... 
>>> len(set(L))
4997

編集:FWIW、単一の対のための2つの同一のを持たない確率である場合: P =(10 - !1)/ 10! およびそれらの組み合わせの数は次のとおりです。 C = 5000! / 4998! * 2! / 2 = 5000 * 4999 その後、重複を有する確率は、次のとおりです。

>>> import math
>>> f = math.factorial(10)
>>> p = 1.0*(f-1)/f
>>> C = 5000.0*4999/2
>>> 1 - p**C
0.96806256495611798
役に立ちましたか?

解決

これは呼ばれています誕生日パラドックスするます。

ウィキペディアからこの公式によるます:

しかし、あなたは唯一の衝突の50%のチャンスがあるために約2200例を必要とする、とあなたはその上の方法です36510!を置き換えます。

他のヒント

それはだから...ランダム!あなたはすべての順列をしたい場合は、単にitertools.permutationsを使用します。

多分理由RANDOMはありますか?ランダム繰り返さないという意味ではありません、それは理論的にはそうではない可能性が高いが、可能性、毎回まったく同じ答えを返すことができますを意味し、それがRANDOMであることを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top