컴퓨터 입장에서의 랜덤
컴퓨터에게 숫자 아무거나 꺼내봐 하면 컴퓨터는 창조 능력이 없기 때문에 완벽한 랜덤 한 수를 못 꺼낸다.
그럼 컴퓨터는 어떻게 랜덤 한 숫자를 계산해 낼까?
예를 들어, 다음과 같이 랜덤 숫자를 뽑는다고 하자.
랜덤 한 숫자 = (시작 숫자 * A + B)/C, 이 대 시작 숫자는 일반적으로 시스템 시간이다.
이러한 방식으로 랜덤 한 숫자를 뽑는다.
그리고 다음 랜덤 숫자를 뽑으라 하면 앞서 구한 랜덤 한 숫자를 시작 숫자에 넣어 계산하게 된다.
그렇기 때문에 시작 숫자를 알 수만 있으면 다음 숫자도 알 수 있게 되어 랜덤 한 숫자라 부르기 모호해진다.
실제로 코딩에서도 랜덤 함수로 랜덤값을 사용하지만 이들도 시작 숫자, 즉 seed 값을 알면 예측 가능한 랜덤 숫자가 된다.
import random
random.seed()
print(random.random())
random.seed()
print(random.random())
random.seed(1234)
print(random.random())
random.seed(1234)
print(random.random())
생각 없이 랜덤 함수를 쓴 경우
예전에 온라인 포커 게임이 있었는 데, 이 게임이 출시된 지 얼마 지나지 않아 패 예측 프로그램이 나오게 되었다.
이 프로그램은 해킹을 하거나 불법적인 행위로 패를 예측한 게 아니다.
그럼 이 프로그램은 어떻게 패를 예측할 수 있었을까?
포커 게임에서 랜덤 하게 하기 위해 랜덤 함수를 사용하였고, 시드를 현재 서버 시간을 초 단위로 설정해 두었다.
즉, 프로그램은 온라인 포커와 똑같은 서버 시간으로 맞춘 다음,
첫 배열된 카드를 보고 해당 조합과 순서가 나올 때까지 반복하면 결국 포커 게임의 패와 프로그램의 패는 동일하게 된다.
그 뒤로 해당 사이트는 금방 망했다고 한다.
게임 확률 미신은 진짜였을지도 모른다!
확률을 다루는 게임에서 항상 이상한 미신이 떠돌고 한다.
강화를 하기 전에 재물을 받쳐야 한다. 어디 장소가 잘 성공한다. 언제 하면 잘 성공한다더라 등의 미신이 있었다.
윗글을 읽었다면 이 미신들이 사실 맞을 수도 있다는 생각이 들기도 한다.
확률을 공정하게 하기 위해 프로그래머는 seed를 무조건 넣어야 한다.
하지만 시간으로만 넣으면 쉽게 예측이 되어 게임이 망한다.
그럼 어떠한 방식으로 seed를 계산할까?
어떤 이상한 개발자는 seed 값에 위치, 강화 횟수 등을 넣어서 만들어 낼 수도 있는 일이다.
해결책
나노초단위와 같은 경우에는 거의 랜덤에 가깝고 예측이 불가능하기에 나노초를 seed에 넣어도 좋다.
언어마다 차이점은 있지만 보완 랜던 함수를 사용하면 중간에 해싱을 해서 다음 숫자를 뽑을 수 있다.
CPU 낭비는 있겠지만, 예측 불가능한 숫자를 뽑을 수 있다.
그리고 요즘 OS들은 하드웨어 노이즈로 난수를 생성해 준다.
이러한 방법을 사용하면 첫 시드도 알 수 없게 된다.
만약 진정한 랜덤 숫자에 가까운 수를 원한다면 random.org에 접속하여 값을 요청하면 얻을 수 있다.
이렇게 다양한 해결책이 있기에 컴퓨터가 창조 능력이 없어 랜덤 한 숫자를 못 뽑는다는 변명은 안 통하게 되었다.
주섬주섬
- 해싱(Hashing)은 원본 문자열을 알아볼 수 없는 난해한 문자열로 정의(표현) 하는 과정을 말한다.
참고
'게임 > 게임 지식' 카테고리의 다른 글
옛날 게임은 어떻게 만들었을까? (0) | 2024.05.30 |
---|
댓글