
일상 언어에서 '무작위'란 예측 불가능함을 의미합니다. 수학과 컴퓨팅에서 무작위성은 더 엄밀한 의미를 가집니다. 이전 값을 모두 알고 있어도 다음 값을 예측하는 데 아무런 도움이 되지 않는 수열을 무작위라고 합니다. 결정론적 기계인 컴퓨터에서 진정한 무작위성을 달성하기란 근본적으로 어렵습니다. 컴퓨터는 정확한 명령을 따르는데, 이것이 바로 예측 불가능성의 반대이기 때문입니다. 이 문제의 해결책은 크게 두 가지로 나뉩니다. 의사난수 생성기(PRNG)와 진정한 난수 생성기(TRNG)입니다.
PRNG는 결정론적 알고리즘으로, 무작위처럼 보이지만 시드(seed)라고 불리는 초기 값에 의해 완전히 결정되는 수열을 생성합니다. 동일한 시드를 사용하면 PRNG는 항상 동일한 수열을 만들어냅니다. 이것이 결함처럼 들릴 수 있지만, 실제로는 여러 상황에서 유용한 특성입니다.
현재 가장 널리 사용되는 PRNG는 메르센 트위스터(Mersenne Twister)로, 주기가 2^19937 − 1에 달합니다(즉, 그 횟수만큼 값을 생성한 후에야 반복됩니다). 거의 모든 통계적 무작위성 검사를 통과합니다. 프로그래밍 언어의 범용 난수 함수 — Python의 random 모듈, Java의 java.util.Random, JavaScript의 Math.random() — 는 내부적으로 PRNG를 사용합니다.
결정적 한계: PRNG는 암호학적으로 안전하지 않습니다. 공격자가 충분한 수의 출력값을 관찰하면 내부 상태를 재구성하고 이후 모든 출력을 예측할 수 있습니다. 보안에 민감한 용도에는 절대로 PRNG를 사용해서는 안 됩니다.
CSPRNG는 이전 출력을 알고 있더라도 계산상 예측이 불가능하도록 설계된 PRNG입니다. 암호학적 단방향 함수를 통해 이를 달성하며, 진정한 엔트로피 원천으로 시드를 설정합니다. 운영 체제는 Linux/macOS의 /dev/urandom이나 Windows의 CryptGenRandom과 같은 인터페이스를 통해 CSPRNG를 제공합니다.
애플리케이션 코드에서의 사용법:
secrets 모듈 (비밀번호와 토큰에는 random 대신 이것을 사용하세요)crypto.randomBytes() 및 crypto.randomUUID()window.crypto.getRandomValues()java.security.SecureRandom보안에 민감한 작업에는 반드시 암호학적 난수 API를 사용하세요. 비밀번호, 토큰, 세션 ID, API 키, 암호화 키, 논스(nonce) 생성이 이에 해당합니다.
TRNG는 진정으로 예측 불가능한 물리적 프로세스에서 무작위성을 도출합니다. 전자 부품의 열 잡음, 방사성 붕괴, 대기 잡음, 또는 광자 도달 시간이 그 예입니다. 은행과 인증 기관에서 사용하는 하드웨어 보안 모듈(HSM)에는 TRNG가 포함되어 있습니다. random.org 같은 서비스는 대기 잡음에서 난수를 생성하며, 복권이나 콘테스트에서 검증 가능한 공정한 난수 원천으로 자주 활용됩니다.
운영 체제의 CSPRNG는 보통 하드웨어 엔트로피 원천(키보드 타이밍, 디스크 I/O, Intel의 RDRAND 같은 하드웨어 RNG 칩)에서 스스로 시드를 설정한 뒤, CSPRNG 알고리즘을 사용하여 그 엔트로피를 스트림으로 확장합니다. 이 하이브리드 방식은 하드웨어 엔트로피의 예측 불가능성과 소프트웨어 생성의 속도를 결합합니다.
Math.random()이나 동등한 함수를 사용하지 마세요.재현 가능성이 중요한 경우 — 특정 테스트 시나리오 재생성, 생성된 결과 공유, 시뮬레이션 디버깅 — PRNG에 고정 값으로 시드를 설정하면 항상 동일한 출력을 얻을 수 있습니다. 많은 게임이 월드 생성에 시드를 사용하여 플레이어들이 흥미로운 맵의 시드를 공유할 수 있게 합니다. 머신러닝 연구자들도 실행 간 재현 가능한 결과를 보장하기 위해 실험 시작 시 난수 라이브러리에 시드를 설정하는 경우가 많습니다.
시드의 품질도 중요합니다. 밀리초 단위의 현재 타임스탬프로 시드를 설정한 PRNG는 공격자가 애플리케이션이 시작된 시점을 대략적으로 안다면 예측 가능합니다. 비보안 목적에는 타임스탬프 시드로도 충분하지만, 출력이 추측 불가능해야 하는 경우에는 CSPRNG를 사용하여 시드를 생성하세요.
무료 난수 생성기 열기 — 원하는 범위에서 중복 여부를 선택해 하나 또는 여러 개의 난수를 브라우저에서 바로 생성하세요.