سؤال

للحصول على قائمة من 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.

ربما لأن عشوائي؟ عشوائي لا يعني أنه لا يتكرر ، فهذا يعني أنه عشوائي ، مما يعني من الناحية النظرية أنه يمكن أن يعيد نفس الإجابة بالضبط في كل مرة ، غير محتمل ولكن ممكن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top