Як працює випадкове переміщення Python?


11

Як перетасувати випадкові роботи в Python?

Я прошу, бо це працює дуже швидко. Коли я намагаюся написати перетасування, це працює 1 хвилину для елемента 10 ^ 6, але перемішування Python робить це за 8 секунд?


14
Чому б не просто подивитися вихідний код ?
лень

4
кращий алгоритм перетасувати є рибалки-Yates перетасувати, він працює в O (N) часу і довела свою досконалу перетасувати (припускаючи , що хороший випадковий джерело)
тріскачки урод

1
@ratchetfreak: Python використовує Fisher-Yates.
Martijn Pieters

1
Який алгоритм перетасовки?
whatsisname

@sloth, до речі, Raymond Hettinger запропонував універсальну практику Docs посилань назад до вихідного коду тому в 2011 році
Cristian Ciupitu

Відповіді:


17

Python's random.shuffleвикористовує перемикання Фішера-Йейта , яке працює в O (n) час і доводиться, що він є ідеальним перетасуванням (якщо вважати хорошим генератором випадкових чисел).

Він повторює масив від останнього до першого запису, перемикаючи кожен запис із записом на випадковий індекс під ним.

Основний процес перетасовки Фішера - Йейтса схожий на випадковий вибір пронумерованих квитків із шапки чи карток із колоди, одна за одною, поки не залишиться більше. Що дає конкретний алгоритм, це спосіб зробити це чисельно ефективно та суворо, що, правильно виконано, гарантує неупереджений результат ...

Сучасне ... рішення - перемістити "ударені" числа до кінця списку, замінивши їх останнім unstruck номером при кожній ітерації. Це зменшує часову складність алгоритму до O (n) порівняно з O (n 2 ) для наївного здійснення. Ця зміна дає наступний алгоритм (для нульового масиву).

To shuffle an array a of n elements (indices 0..n-1):
  for i from n  1 downto 1 do
       j  random integer with 0  j  i
       exchange a[j] and a[i]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.