为什么我会收到与random.shuffle的DUP在Python?
-
22-09-2019 - |
题
有关的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
解决方案
其他提示
由于它的... ...随机!如果你想所有的排列只是使用和itertools.permutations。
也许是因为是随机的?随机并不意味着不会重复,这意味着它是随机的,其手段在理论上它可能每次都返回完全相同的答案,而不是可能而是可能的。
不隶属于 StackOverflow