لماذا أحصل على dups مع عشوائي.
-
22-09-2019 - |
سؤال
للحصول على قائمة من 10 ints ، هناك 10! أوامر أو التباديل المحتملة. لماذا العشوائي.
>>> 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 * 4999/2 ثم احتمال وجود تكرار هو:
>>> 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.
ربما لأن عشوائي؟ عشوائي لا يعني أنه لا يتكرر ، فهذا يعني أنه عشوائي ، مما يعني من الناحية النظرية أنه يمكن أن يعيد نفس الإجابة بالضبط في كل مرة ، غير محتمل ولكن ممكن.
لا تنتمي إلى StackOverflow