유사 난수

컴퓨터는 이론족으로 완벽한 난수를 생성할 수 없다. 주어진 명령을 수행하는 기계이기 때문이다. 그래서 난수표, 난수 알고리즘, 알고리즘 초기화에 사용에 사용할 seed 값으로 난수를 만든다. 이러한 형태로 만들어진 난수를 유사 난수 라고 한다. 유사 난수 알고리즘에는 여러가지가 있지만, 메르센 트위스터 난수 알고리즘을 사용한다.

또한, 오늘날 에는 알고리즘 대신 열 잡음, 광전자 등 신호의 노이즈를 이용해 시드가 필요없는 하드웨어 랜덤 번호 생성기 (HRNG)를 사용하기도 한다.

유사 난수를 사용할 때는 시드값이 적절하게 적용되는지 확인해야한다. 알고리즘에 따라 시드값이 같으면 같은 순서의 난수를 얻기 때문이다. 예측 할 수 있는 난수는 암호학적인 관점에서 안전하다고 볼 수 없다.

암호학적으로 안전한 난수

암호학적으로 안전한 난수는 유사 난수와 비교했을 때 생성 속도가 상대적으로 느리지만 시드 값을 사용하지 않아서 예측이 불가능하다는 장점이 있다.

리눅스 계열에서 /dev/urandom 파일이나 윈도우 계열이 BCryptGenRandom() 함수들을 사용하면 노이즈에 기반한 난수값을 얻을 수 있다.

공정한 난수, 셔플 백

난수가 사용자 경험(UX)에 직접적인 영향을 끼칠 때는 난수를 엄격하게 제어해야한다.

예를 들어, 난수를 열번 생성하는 제비 뽑기가 있을 경우 3 이하의 숫자가 나오면 당첨이라고 할때, 한번도 당첨 숫자가 나오지 않는 경우도 있을 수 있다.

이런 상황에서 사용할 수 있는 것이 셔플 백 이다. 셔플 백이란 난수를 제어하는 기법으로 발생할 수 있는 모든 가능성을 한 가방에 넣고 섞는 방법이다. 당첨과 꽝의 비율을 동일하되 뽑는 순서만 난수를 적용하는 것이다.