본문 바로가기
알면 쓸만할 수도 있는 컴퓨터 지식

랜덤은 랜덤이 아니다? 난수는 어떻게 만들어 지는가 (2)

by stdlib.h 2024. 5. 1.

오늘은 저번 시간의 과제로 남겨두었던 난수가 실제로 어떻게 만들어지는지에 대해 써보려고 한다.

 

난수가 생성되는 방법은 여러가지가 있겠지만, 대표적으로 중앙제곱법, 선형합동법, 메르센 트위스터 등이 있다.

 

이전 시간에 이야기했던 난수표는 이러한 알고리즘들이 나타내는 수의 분포를 정리한 것이다. 이게 무슨 소리인지 이해가 가지 않을 수 있지만, 다음 공식을 보면 이해될 것이다.

 

출처 : 나무위키

위 식은 폰노이만이 1949년에 제안한 중앙 제곱법의 수식이다. 식을 살펴보면 X0가 시드가 될 것이다.

a가 2고 시드(X0)로 88를 넣었다고 하면, 7744라는 결과가 나온다. 7744의 가운데 2자리가 Xn+1이 되므로 생성된 난수는 74가 된다. 

수학에 밝은 사람이라면 이런 생각이 들 수도 있을 것이다. 

 

"어? 이거 하다보면 계속 일정한 순서로 반복되는데?"

 

맞다. 중앙제곱법은 실제로 일정한 패턴으로 반복하게된다. 때문에, 어떤 시드를 넣느냐에 따라서 정해지는 패턴이 생기게 되고, 이런 수의 분포를 그러모아 난수표라는 표현을 쓰게 된 것이다.

 

이 다음으로는 대부분의 프로그램에서 주로 쓰이는 (C언어 역시 이 방법을 사용하고 있다.) 선형 합동법이다. 이때 수학적 합동이란 우변을 어떤 수 M으로 나눈 나머지가 좌변과 같을 때를 뜻한다.

 

역시 나무위키의 도움을 받았다.

 

마찬가지로 Xn이 시드가 되고, c는 임의의 상수(ANSI 표준에서는 12345다), a역시 임의의 상수(ANSI에선 1103515245다.)로 정해져있다. 척 보기에도 한 번 곱하고, 더하고, 나누기만 하면 되니 굉장히 빨라 보인다.

 

실제로 계산에 걸리는 시간이 매우 짧다는 장점이 있지만, 중앙제곱법과 마찬가지로 수의 분포(결과값으로 나오는 수)가 편향되어있고, 주기성을 가져 어느 순간엔가 반복하게 된다는 단점을 공유한다.

 

어떻게 개선이 되어가고있는지 느껴지는가? 그렇다. 의사난수는 수의 분포가 고르고, 주기가 굉장히 길거나 없도록 발전하고 있다.

 

이 외에는 메르센 소수라는 것을 이용한 메르센 트위스터 알고리즘이 많이 쓰이고있으나, 여백이 부족하고 수학적 지식 없이는 이해하기 힘들어 다음에 기회가 된다면 다뤄보도록 하겠다.

 

 

"그럼 지금 컴퓨터는 어떻게 랜덤을 만들어내고있는데?"

 

최근에는 이런 방법들로 '진짜'랜덤에 가깝거나, 진짜 랜덤을 만들어내고있다.

 

자연에 존재하는 방사선을 측정하는 가이거 계수기의 값.

하드웨어의 주변에 발생한 노이즈.

양자의 불확정성 원리를 이용한 양자 난수 (정말로 랜덤이다!)

 

이런 방법들이 있다. 저번 시간에 자연에서 측정한 소리도 패턴을 가져서 일종의 난수표가 된다고 하지 않았냐고?

다른 차이점이 있다.

위의 방법들은 자연에서 받은 소리를 저장하지않고 요청받았을 때 자연으로부터 입력받아 1회용으로 사용하기때문이다.

 

음악을 음계로 표현하여 시작과 끝을 정할 수 있는 것 처럼, 컴퓨터의 안으로 들어가면 정해진 시간을 따르게 된다. 때문에 4번째의 음 다음으로 올 5번째의 음 역시 이미 정해져있다. 하지만 자연의 소리는 다르다. 완전히 동일한 환경과 장소에서 측정을 진행하더라도 노이즈나 방사선의 요동마저 완벽히 재현할 수는 없기 때문이다.

 

이토록 기술이 발전했음에도 불구하고 일기예보가 틀리는 것 처럼.

우리가 예측할 수 없다는 사실이 자연의 신비로움이 아닐까 한다.