TL; DR: It „przerwy” na listach z ponad 2080 elementów, ale nie przejmuj się zbytnio :)
pełna odpowiedź:
Przede wszystkim należy zauważyć, że „tasowania” listę może być rozumiane (konceptualnie) jako generowanie wszystkich możliwych permutacji elementów list i wybieranie jednej z tych permutacji losowo.
Następnie należy pamiętać, że wszystkie samodzielne skomputeryzowane generatory liczb losowych są w rzeczywistości "pseudo" losowe. Oznacza to, że w rzeczywistości nie są przypadkowe, ale polegają na szeregu czynników, które próbują wygenerować liczbę trudną do odgadnięcia w sposób zaawansowany lub celowo odtworzony. Wśród tych czynników jest zwykle poprzednia wygenerowana liczba. Tak więc w praktyce, jeśli użyjesz losowego generatora w sposób ciągły określoną liczbę razy, w końcu zaczniesz ponownie otrzymywać tę samą sekwencję (jest to "okres", do którego odnosi się dokumentacja).
Wreszcie, docstring na Lib/random.py (moduł losowy) mówi, że "Okres [generatora liczb losowych] to 2**19937-1
."
W związku z tym, jeśli lista jest taka, że istnieje 2**19937
lub więcej kombinacji, niektóre z nich nigdy nie zostaną uzyskane przez przetasowanie listy. Powinieneś (ponownie, koncepcyjnie) wygenerować wszystkie permutacje listy, następnie wygenerować losową liczbę x i wybrać permutację x. Następnym razem wygenerujesz kolejną losową liczbę y i wybierzesz Y. permutację. I tak dalej. Ale ponieważ istnieje więcej permutacji, niż dostaniesz losowe liczby (ponieważ, co najwyżej po 2**19937-1
wygenerowanych liczbach, zaczniesz znowu otrzymywać te same), zaczniesz znowu wybierać te same permutacje.
Jak widzisz, nie jest to kwestia długości twojej listy (chociaż to wchodzi w równanie). Ponadto, 2**19937-1
jest dość długa. Ale nadal, w zależności od twoich tasujących potrzeb, powinieneś o tym pamiętać. W uproszczonym przypadku (iz szybkim obliczeniem), dla listy bez powtarzających się elementów, 2081 elementów dałoby permutację 2081!
, która jest większa niż 2**19937
.
+1 za przyjemne wyjaśnienie tematu i problemu. Imho to powinna być zaakceptowana odpowiedź. Aha, i przesunąłbym TD, DR na szczyt, ponieważ większość ludzi boi się treści tekstu prawdopodobnie nie przeczyta tak daleko :-). – Joey
Dzięki :) I dobry pomysł na TL; DR, zrobię to! – rbp
@Johannes: nie musisz usunąć swojej odpowiedzi :) Wciąż, dzięki! – rbp