10 정수의 목록은 10입니다! 가능한 명령 또는 순열. random.shuffle이 5000 번 시도한 후에 중복을주는 이유는 무엇입니까?왜 random.shuffle을 사용하여 dups를 파이썬으로 구할 수 있습니까?
>>> 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 = (! 1 - 10)/10! 이고 조합 수는 C = 5000!/4998! * 2! = 5000 * 2분의 4,999 는 중복을 가질 확률은 다음과 같습니다
>>> import math
>>> f = math.factorial(10)
>>> p = 1.0*(f-1)/f
>>> C = 5000.0*4999/2
>>> 1 - p**C
0.96806256495611798
입니다. Birthday Paradox (google it)로 인해, N 가능성 중에서 선택된 N ** 0.5 항목 사이에서 중복 가능성이 높습니다. 여기서 N = 10! (10!) ** 0.5 ~ = 1900 시도 후에 dups를 예측합니다. 반복을 피하는 코드는 http://stackoverflow.com/questions/2124347/how-to-generate-permutations-of-array-in-python/2124365#2124365를 참조하십시오. –
고마워요. 나는 실제로 생일 Paradox를 알고있다. 그러나 그것을 할인했다. 나는 DUP의 50 %의 기회를 얻기 위해 N ** 0.5 의존성을 인식하지 못했습니다. – telliott99