파이썬 랜덤 셔플은 어떻게 작동합니까?


11

파이썬에서 무작위 셔플은 어떻게 작동합니까?

매우 빠르게 작동하기 때문에 묻습니다. 셔플을 쓰려고 할 때 10 ^ 6 요소에서 1 분 동안 작동하지만 파이썬 셔플은 8 초 안에 작동합니까?


14
소스 코드를 보지 않겠습니까?
나무 늘보

4
최고의 셔플 알고리즘은 피셔-이야 스 셔플이며 O (n) 시간에 실행되며 완벽한 무작위 셔플 (좋은 무작위 소스를 가정)으로 입증되었습니다.
ratchet freak

1
@ratchetfreak : 파이썬은 Fisher-Yates를 사용합니다.
Martijn Pieters

1
셔플 알고리즘은 무엇입니까?
whatsisname

@sloth, 그런데 Raymond Hettinger 는 2011 년 에 소스 코드로 다시 연결되는 문서의 보편적 인 관행을 제안 했습니다.
Cristian Ciupitu

답변:


17

파이썬 random.shuffleFisher-Yates shuffle을 사용하는데 , 이는 O (n) 시간에 실행되며 완벽한 임의 순서 생성기라고 가정합니다.

배열을 마지막 항목에서 첫 번째 항목으로 반복하여 각 항목을 그 아래의 임의 색인의 항목으로 전환합니다.

Fisher–Yates 셔플 링의 기본 프로세스는 더 이상 남지 않을 때까지 모자에서 번호가 매겨진 티켓이나 데크에서 카드를 무작위로 선택하는 것과 유사합니다. 특정 알고리즘이 제공하는 것은 효율적이고 엄격한 방식으로 수치 적으로 수행하는 방법입니다.

현대적인 해결책은 "반복 된"숫자를 각 반복에서 마지막으로 눌리지 않은 숫자로 바꾸어 목록의 끝으로 옮기는 것입니다. 이는 순진한 구현을위한 O (n 2 ) 와 비교하여 알고리즘의 시간 복잡성을 O (n)으로 줄 입니다. 이 변경 사항은 다음 알고리즘을 제공합니다 (0 기반 배열의 경우).

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]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.