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

컴퓨터의 랜덤은 진짜 랜덤이 아니다? 의사 난수에 대한 이야기 (1)

by stdlib.h 2024. 4. 24.

 

약 6 년 만에 복귀한 첫 글의 주제로 선택한 것은 의사 난수( Pseudo Random )에 대한 이야기이다.

의사난수에 대한 설명과 그와 관련된 알고리즘을 하나 소개해볼까 한다.

 

이 상자에 무엇이 들어있을까?

 

우리는 컴퓨터로 게임이나 작업, 하다 못해 누가 당첨일지 사다리 타기를 하면서까지 수많은 랜덤을 만나게 되는데, 가끔 '동시'에 서로 다른 사람이 랜덤을 뽑았을 때 동일한 결과를 가져본 적이 있을 것이다. ( 워크래프트나 스타크래프트를 해본 사람은 안다 ) 

마인크래프트 같은 로그라이크류 게임의 시작에서 어떤 특정한 Seed를 입력하니까 동일한 시작을 할 수도 있다. 그렇다면 이런 의문을 가져본 적이 있을 수도 있다. 

 

"어, 이거 진짜 랜덤 맞아? 왜 똑같은 결과가 나오지?"

 

그렇다. 컴퓨터 속에 존재하는 대부분의 랜덤은 진짜 랜덤이 아니다. 이러한 가짜 랜덤들을 의사 난수( Pseudo Random )이라 하는데, 크게 다음과 같은 방법으로 만들어진다.

 

1. 이미 만들어져 있는 난수 표를 활용하는 방법

 

의사표는 이런식으로 생겼다.

 

2. 자연의 소리, 컴퓨터 부품 속 소리 등 외부의 소음을 이용하는 방법

 

먼저 난수 표를 활용한 방법은 컴퓨터 속에 이미 만들어져 있는 난수표가 존재한다.

현재 시각, 임의의 숫자 등을 가공하여 특정한 행과 열을 만들어 난수표를 읽어내는 방식이다.

 

랜덤을 돌릴 때 마다 컴퓨터가 힘들게 표를 뒤지게 된다.

 

이 행과 열을 정해진 공식에 따라 만들게 되는 임의의 숫자, 현재 시각, 사용자의 입력 등을 모종과 같다고 하여 Seed라 한다. 대부분의 랜덤은 현재 시각을 Seed로 사용하므로 '동시'에 랜덤을 사용했을 때 동일한 결과를 얻는 것이다!

때문에 이 Seed 값을 추측할 수 있다면 컴퓨터가 어떤 랜덤 한 숫자를 출력할지 모두 예측할 수 있게 된다.

 

혹시라도 여러분이 정말, 정말로 능통하다면 좋아하는 게임의 장비 강화가 언제 붙을지도 모두 예측할 수 있을지도 모른다. ( 겠냐? )

 

 

 

그렇다면 자연의 소리 등 외부의 소음을 이용하는 방법은 왜 난수가 아닐까?

 

언젠간 실제로 이런 시대가 올 수도 있지 않을까..?

 

자연에서 발생하는 소리들은 모두 예측할 수 없지만, 녹음 할 때와 동일한 환경을 조성하여 재현할 수 있다. 또한 사용하기 위해 컴퓨터에 기록(저장)되는 순간 일정한 패턴을 가진 또 다른 난수표가 되어버리기 때문이다.

 

이로써 여러분들은 고전 게임(스타크래프트, 워크래프트 등)을 할 때 시간을 활용하여 원하는 랜덤 결과를 얻을 수 있게 되었다.

 

다음 시간에는 이러한 의사 난수들을 실제로 생성하는 방법과, 앞서 나열한 문제점 ( Seed만 알면 예측이 쉽다 )을 해결하기 위해 개발된 메르센 트위스터 알고리즘, 멀티 스레드를 활용한 방법 등을 소개해볼까 한다.