ALGORITHM / Science • 2026. 02. 07

진정한 무작위란 무엇인가? 난수 생성 알고리즘과 공정성

컴퓨터는 기본적으로 결정론적(Deterministic)인 기계입니다. 동일한 코드가 실행되면 반드시 동일한 결과값을 산출해야 하죠. 하지만 우리는 '무작위'가 필요한 순간을 수없이 마주합니다. eleslog.work의 점심 룰렛이나 당첨자 추첨 시스템에서 결과에 의구심이 생기지 않도록 보장하는 힘은 어디서 올까요?

단순한 '랜덤' 뒤에 숨겨진 수학적 알고리즘과, 시스템의 공정성을 확보하기 위해 필수적으로 이해해야 할 난수 생성 기술의 세계를 분석합니다.

1. 의사 난수(Pseudo-Random) vs 진정 난수(True Random)

프로그래밍 환경에서 무작위 수는 크게 두 가지 방식으로 나뉩니다.

2. 고전 알고리즘: 선형 합동법(LCG)

초기 컴퓨터 공학에서 널리 쓰였던 선형 합동법(Linear Congruential Generator)은 수식이 매우 간단하여 자원이 부족한 환경에서 빛을 발했습니다.

$$X_{n+1} = (aX_n + c) \mod m$$

하지만 LCG는 치명적인 약점이 있습니다. 난수들의 분포를 고차원 그래프로 그렸을 때 특정 격자 무늬(Pattern)가 나타난다는 점과, 주기가 짧아 반복적인 결과가 금방 노출된다는 것입니다. 현대의 정교한 서비스에서는 거의 쓰이지 않는 방식입니다.

3. 현대의 표준: 메르센 트위스터(Mersenne Twister)

파이썬, 루비, PHP 등 수많은 언어의 기본 난수 함수는 메르센 트위스터 알고리즘을 사용합니다. 이 알고리즘은 주기(Period)가 무려 $2^{19937}-1$에 달해, 우주의 나이만큼 생성해도 수열이 반복되지 않을 정도로 거대합니다. 또한 623차원까지 균일한 분포를 보장하여 데이터 과학이나 일반 게임 환경에서 사실상 완벽한 무작위를 제공합니다.

4. 보안의 핵심: CSPRNG와 시드 제어

의사 난수의 가장 큰 적은 '예측 가능성'입니다. 만약 온라인 뱅킹이나 암호키 생성 시 Math.random()을 사용한다면 공격자는 시드값을 역추적하여 다음 생성될 토큰을 미리 알아낼 수 있습니다.

보안 강화 팁 (CSPRNG 활용):
보안이 중요한 통신이나 금전적 거래가 포함된 추첨에서는 암호학적으로 안전한 의사 난수 생성기(Cryptographically Secure PRNG)를 사용해야 합니다.
- Browser Environment: window.crypto.getRandomValues()
- Node.js: crypto.randomBytes()

이 함수들은 마우스의 움직임, 네트워크 지연 시간 등 엔트로피가 높은 시스템 자원을 시드에 포함시켜 예측을 불가능하게 만듭니다.

5. 증명 가능한 공정성(Provably Fair)

사용자들에게 "이 룰렛 결과는 조작되지 않았다"는 믿음을 주는 기술적 증명이 중요합니다. 최근 eleslog.work와 같은 신뢰 중심 서비스들에서는 다음의 프로세스를 도입합니다.

  1. 사용자에게 해싱된 서버 시드(Server Seed)를 미리 보여줍니다.
  2. 사용자가 입력한 임의의 값(Client Seed)을 섞어 최종 난수를 생성합니다.
  3. 이벤트가 끝난 후, 원본 서버 시드를 공개합니다.
  4. 사용자는 해시 함수를 통해 공개된 시드가 처음에 보여준 해시값과 일치하는지 확인하여 조작 여부를 직접 검증합니다.

마치며: 신뢰를 구축하는 알고리즘

"무작위"는 혼돈처럼 보이지만, 기술적으로는 철저히 설계된 질서 위에 존재합니다. 우리가 어떤 알고리즘을 선택하느냐에 따라 서비스는 단순한 장난감이 될 수도, 신뢰할 수 있는 도구가 될 수도 있습니다.

eleslog.work는 모든 사용자가 공정하게 결과를 받아볼 수 있도록, 검증된 난수 체계를 유지하며 보이지 않는 곳에서의 신뢰를 쌓아가고 있습니다.