소프트웨어, 머신러닝 모델, 확률과정 등을 개발할 때, 많은 부분에서 우리는 random()이라는 함수를 이용하여 난수를 생성한다. 그러나 엄밀히 정의하면 우리가 사용하는 많은 난수 생성 함수는 실제 난수 (true random number, TRN)가 아니라, 유사 난수 (pseudo random number, PRN)이다. 먼저 실제 난수는 단어 그대로 실제 무작위 추출 과정에 의해 생성된 난수로써, 아래의 3가지 속성을 갖는다.
- 예측불가능성 (Unpredictable): 생성되는 난수의 값은 예측될 수 없어야한다.
- 무편향성 (Unbiased): 생성되는 난수들에 특정 경향성이 나타나서는 안 된다.
- 무관성 (Uncorrelated): 생성되는 난수들 사이에 관련성이 없어여한다.
그러나 우리가 사용하는 컴퓨터는 근본적으로 입력에 대한 계산 과정에서 무작위성이 개입되지 않도록 설계되었기 때문에 예측불가능성, 무편향성, 무관성을 모두 만족하는 난수를 생성하는 것에 적합하지 않다. 이러한 이유로 실제 난수를 생성하기 위해서는 물리 및 전기적으로 발생하는 불규칙한 노이즈를 감지하여 난수를 도출하는 추가적인 하드웨어가 필요하다.
컴퓨터과학자들은 추가적인 하드웨어 없이 효율적으로 난수를 생성하기 위해 여러 알고리즘을 개발했는데, 이러한 알고리즘을 통해 생성된 난수를 유사 난수라고 한다. 예를 들어, 선형합동법 (Linear congruential sequence)은 유사 난수를 생성하기 위해 사용되는 알고리즘 중 하나로써, 식 $\eqref{eq:lcg}$과 같이 $i$번째 난수 $x_i$를 생성한다.
$$\begin{equation} x_i = (a x_{i-1} + c)\;\%\;m \label{eq:lcg} \end{equation}$$
일반적으로 프로그래밍 언어에서 $%$는 왼쪽의 값을 $m$으로 나눴을 때의 나머지를 반환하는 modulo 연산자이며, 상수 $a, c, m$은 ANSI C와 같은 표준 규약에 의해 특정 값으로 설정된다. 식 $\eqref{eq:lcg}$에서 $x_0$는 개발자가 설정하거나 무작위로 선택되는 시드 (seed)에 의해 정해진다. C언어나 파이썬에 구현된 random()함수의 정의를 자세히 보면 seed라는 매개변수가 있는 것을 확인할 수 있다.
그러나 식 $\eqref{eq:lcg}$에 나타나듯이 선형합동법에 의해 생성되는 유사 난수는 seed를 알고 있다면 예측이 가능하며, 또한 생성되는 난수 사이에는 연관성이 존재한다. 이러한 이유로 유사 난수는 엄밀히 정의하면 난수가 아니다. 그럼에도 불구하고 유사 난수는 다양한 응용에서 사용되고 있는데, 실제 난수와 유사 난수의 장단점은 아래의 표 1과 같다.
표1. 실제 난수와 유사 난수의 장단점
실제 난수 | 유사 난수 | |
장점 | - 실제 무작위성을 가짐 - 예측불가능성으로 인해 보안에 유리 |
- 별도의 하드웨어 장치가 필요 없음 - 난수 생성 속도가 빠름 - 재현이 가능하여 다양한 테스트에 활용 가능 |
단점 | - 물리적 노이즈 감지를 위한 하드웨어 필요 - 재현이 불가능하여 테스트에 활용이 불가능 - 난수 생성 속도가 느림 - 노이즈의 소스에 따라 편향성이 존재 |
- 엄밀한 정의에서 난수가 아님 - 매우 약한 예측불가능성과 무관성 - 보안이 요구되는 응용에 부적합 |