najlepszym algorytmem losowania jest losowanie rybaków , działa ono w czasie O (n) i okazało się, że jest idealnym tasowaniem (przy założeniu dobrego losowego źródła)
Python random.shuffleużywa tasowania Fishera-Yatesa , który działa w czasie O (n) i udowodniono, że jest idealnym tasowaniem (przy założeniu dobrego generatora liczb losowych).
Powtarza tablicę od ostatniej do pierwszej pozycji, przełączając każdą pozycję z pozycją o losowym indeksie poniżej.
Podstawowy proces tasowania Fishera – Yatesa jest podobny do losowego wybierania ponumerowanych biletów z kapelusza lub kart z talii, jeden po drugim, aż nie będzie już więcej. Ten konkretny algorytm zapewnia sposób wykonywania tego numerycznie w wydajny i rygorystyczny sposób, który odpowiednio wykonany gwarantuje obiektywny wynik ...
Nowoczesne ... rozwiązanie polega na przenoszeniu „trafionych” liczb na koniec listy poprzez zamianę ich z ostatnią nieotkniętą liczbą przy każdej iteracji. Zmniejsza to złożoność czasową algorytmu do O (n), w porównaniu do O (n 2 ) dla implementacji naiwnej. Ta zmiana daje następujący algorytm (dla tablicy zerowej).
To shuffle an array a of n elements (indices 0..n-1):for i from n −1 downto 1do
j ← random integer with0≤ j ≤ i
exchange a[j]and a[i]
Odpowiedzi:
Python
random.shuffle
używa tasowania Fishera-Yatesa , który działa w czasie O (n) i udowodniono, że jest idealnym tasowaniem (przy założeniu dobrego generatora liczb losowych).Powtarza tablicę od ostatniej do pierwszej pozycji, przełączając każdą pozycję z pozycją o losowym indeksie poniżej.
źródło