어떻게 값을 생성하는 함수를 가지고 있을때, 순열을 어떻게 랜덤하게 셔플할 수 있을까?

알고리즘

  1. 어떤 순열 이 있다고 하자.
  2. k = n 으로 두고 시작한다.
  3. 일때 라고 하자. 를 생성해서 를 구한다.
  4. 를 바꾼다.
  5. 을 하고, 만일 라면, 3으로 돌아간다. 아니라면 멈춘다.

코드

import random
 
r = random.random
 
def random_shuffle(lst):
    n = len(lst)
    tmp = lst[:]
    for i in range(n, 1, -1):
        j = int(r() * i)
        tmp[i-1], tmp[j-1] = tmp[j-1], tmp[i-1]
 
    return tmp
 
l = list(range(10))
print(random_shuffle(l))