有关的10个整数的列表中,有10!可能的顺序或排列。为什么random.shuffle给予重复后仅5000尝试?

>>> 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,如果不具有两个用于单对相同的概率是: P =(10 - 1)/ 10! 和组合的数目是: C = 5000! / 4998! * 2! = 5000 *2分之4999 然后将具有一个重复的概率是:

>>> import math
>>> f = math.factorial(10)
>>> p = 1.0*(f-1)/f
>>> C = 5000.0*4999/2
>>> 1 - p**C
0.96806256495611798
有帮助吗?

解决方案

它被称为生日悖论

据来自维基百科这个公式:

365替换10!你只需要大约2200的例子有碰撞的可能性为50%,而你是上述的方式。

其他提示

由于它的... ...随机!如果你想所有的排列只是使用和itertools.permutations。

也许是因为是随机的?随机并不意味着不会重复,这意味着它是随机的,其手段在理论上它可能每次都返回完全相同的答案,而不是可能而是可能的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top