중복되지 않는 랜덤 숫자 리스트를 일반적으로는 shuffle 이라고 부른다. 쉽게 말해 이미 존재하는 숫자 리스트에 대해 트럼프 카드를 섞는 것 처럼 섞으면 중복되지 않는 랜덤 숫자 리스트를 만들 수 있다. 그런데 이렇게 하면 전체 숫자리스트를 저장해야 해서 메모리 사용이 많은 문제가 있다. 그리고 속도도 그렇게 빠른 편이 아니다. 
 리스트 아이템에 대해 섞는 대표적인 알고리즘은 Fisher–Yates shuffle(https://ko.wikipedia.org/wiki/%ED%94%BC%EC%85%94-%EC%98%88%EC%9D%B4%EC%B8%A0_%EC%85%94%ED%94%8C )이다. 

그런데 적당히 중복되지 않는 랜덤 숫자 리스트(적당히라는 의미는 security 관점에서 보면 하나의 숫자 다음의 숫자를 예측 할 수도 있다는 의미이다.)를 만들려고 한다면 암호화 알고리즘을 이용하면 괜찮을 거라는 생각을 했다. 데이터를 암호화 한다는 것은 복화화가 가능해야 하기 때문에 모든 대응이 1대1 이라는 의미이다. 이 말은 암호화된 결과는 중복되지 않는다는 의미이다. 대충 아래와 같은 생각을 할 수 있다. 

for i in range(N):
	new_i = 암호화(i)
    if new_i >= N:
    	continue
    print(new_i)

이렇게 출력된 new_i 는 N 보다 작을 것이고 중복되지 않을 것이다.

좋은 생각이긴 한데, 일반적인 암호화는 최소 block 이 64bit 이다. (blowfish 의 최소 blocksize 가 64bit 이다.)
간단히 32bit 이하 숫자에 대해서는 제공하는 암호화는 없다. 그래서 간단히 1대1 대응이 되는 연산을 반복해서 암호화 유사하게 만들어 보았다. 

코드는 
https://gist.github.com/yiunsr/d1186be93fb99119a15a0917efdb1d27  
에서 확인 할 수 있다.