컴퓨터에서는 무작위 숫자를 어떻게 출력하는 건가요?

우리가 n부터 m까지중에서 랜덤한 숫자를 고르라고 명령을 받으면, 그냥 머릿속에 떠오르는 숫자를 내뱉잖아요?
예를 들어 1부터 20까지의 수 중에서 아무거나 골라봐라. 라고 하면
그냥 진짜 생각나는 대로 12번! 이라고 하는것 처럼요.
그런데 컴퓨터는 스스로 생각을 하지 못하잖아요?? (아직까지는 말이죠.)
그럼 컴퓨터는 랜덤한 숫자를 어떻게 골라내는 거죠?
무언가 규칙이 있으면 그건 랜덤이 아닐텐데…

네? 왜 알고 싶어하냐구요? 아니 그냥 갑자기 랜덤하게 궁금해져서요.

저도 자세한 원리는 모르지만 특정 시드값을 주면(보통 현재시각이나… 상황에 따라 달라지는 값 아무거나) 시드값에 매우 민감하게 반응하는 랜덤엔진을 돌려서 반환하는 걸로 알고있어요


정확히 그런 랜덤엔진이 어떤건지 궁금하시면 이런걸 참고해보세요. 저는 안읽었어요 ㅋㅋ!

안녕하세요.

Random Number Generator 를 구현하는 방법은 엄청 많죠 ㅎㅎㅎ
보안에서 중요하기도 해서 많은분들이 오랫동안 연구해왔답니다.

요즘은 양자난수 생성기라는게 있다네요 ㅎㅎㅎ
한번 찾아보세요~

기기마다 조금씩 차이가 있는데요, 저희가 흔히 쓰는 인텔 CPU의 경우 회로에서 발생하는 미세한 온도의 변화를 기반으로 빠르게 무작위 비트 값들을 생성한다고 해요. (출처: RDRAND - Wikipedia 참조 2번 12페이지) Lukas.J.Han님이 말씀하셨듯이 최근에는 양자의 특성을 이용해 무작위 수를 생성하려고도 한답니다.


암호 쪽으로 언급을 조금 하자면, 이렇게 무작위 숫자(=난수)를 생성해주는 기계를 부르는 명칭은 많아요. (random oracle, hardware/true random number generator, entropy source, …) 여기서는 TRNG, 즉 진짜(true) 무작위로(random) 수를(number) 만들어주는 근원(generator)이라고 하겠습니다.

현대 암호학에서는 암호의 보안성을 수학적으로, 엄밀히 증명하려고 하는 경우가 많습니다. 논리적으로 생긴 모순은 곧 암호의 취약점과 직결될 수 있기 때문입니다.

여기서 쓰이는 (사실 암호학이 아니더라도 유용한) PRNG란, “재현이 가능한”, 즉 결정론적인 난수 생성기입니다. 어떤 것이냐면, 겉으로 보기에는 마치 무작위 숫자처럼 보이지만, 두 사람이 서로 어떤 것을 공유하고 (숫자, 행렬 등) 이를 어떤 함수에 넣었을 때 두 함수 모두 같은 숫자들을 같은 순서대로 주는 기계입니다.

어쩌면 이것 하나만으로도 암호를 만들 수 있지 않을까요? 안전한 암호를 위해서는 몇 가지 수학적인 특성들이 더 필요하지만 PRNG는 이렇게 “공유 가능한” 무작위 생성기를 만들 때 쓰이곤 합니다.

또는, 하드웨어에서 난수를 생성하는 게 프로그램 안의 명령어를 몇 개 실행하는 것보다 느린 경우가 있습니다. (사실 꽤 많습니다!) 이런 경우 하드웨어에서 무작위 수를 일정 갯수만큼 받아온 뒤, 이를 활용해서 빠르게 다른 무작위 숫자들을 생성하기도 합니다.

예를 들어, CodePlatina님이 말씀하신 메르센 트위스터는 PRNG인데요, (회로 위의 미세한 온도 변화와 같이) 예측 불가능한 값을 기반으로, 고르게 분포된 무작위 수를 + 아주 많이 생성하기 위해 주로 쓰입니다.

메르센 트위스터에서도 메르센 트위스터를 시작할 무작위 숫자를 입력으로 받는데, 이를 시드라고 합니다. 이 생성기의 특징은 32비트의 시드값만으로도 2^19937-1개의 숫자를 고른 분포로 생성해준다는 특징이 있어요.

정리하자면 흔히 쓰이는 무작위 생성기는 시드 (또는 엔트로피) + PRNG로 이루어져있는 경우가 많고, 시드는 예측 불가능한 값을 쓰곤 합니다. TRNG만 써도 무작위 숫자를 생성할 수 있고, PRNG는 효율성 또는 사용자들 간에 같은 수열을 공유하고자 할 때 쓰입니다.

사실 물어보신 내용에 대한 답변은 첫 문단만인거같네요… 뭔가 스스로 정리할 겸 적어보았읍니다

1 Like

답글 달아주신 분들 모두 감사합니다!