Як перетасувати випадкові роботи в Python?
Я прошу, бо це працює дуже швидко. Коли я намагаюся написати перетасування, це працює 1 хвилину для елемента 10 ^ 6, але перемішування Python робить це за 8 секунд?
Як перетасувати випадкові роботи в Python?
Я прошу, бо це працює дуже швидко. Коли я намагаюся написати перетасування, це працює 1 хвилину для елемента 10 ^ 6, але перемішування Python робить це за 8 секунд?
Відповіді:
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]