게시일 · · 최종 검토일 · · 6분

한국어 · English

같은 시드, 같은 결과: 재현 가능한 난수

컴퓨터의 난수에는 "시드"라는 출발점이 있고, 같은 시드로 시작하면 같은 난수가 같은 순서로 나옵니다. 복권 랩에서 시드를 2026으로 두고 로또 6/45를 5번 추첨하면 언제 몇 번을 해도 6-8-10-24-33-43, 6-12-14-19-29-42, 1-12-18-21-28-38, 5-12-15-24-25-43, 14-15-19-28-43-44가 나옵니다. 무작위인데 되풀이된다니 모순처럼 들리지만, 이 성질이 시뮬레이션과 테스트에서 아주 쓸모가 있습니다. 반대로 같은 성질이 위험이 되는 곳도 있습니다. 이 글은 시드가 무엇이고, 같은 결과를 얻으려면 무엇이 같아야 하는지, 시드의 범위가 왜 한계가 되는지를 설명합니다.

같은 시드는 같은 결과를 낸다

복권 랩의 난수 엔진은 xoshiro128**라는 빠른 난수 생성 공식을 씁니다. 사용자가 시드 문자열을 주면 그것을 네 개의 32비트 수로 바꿔 출발점으로 삼고, 시드를 비워 두면 브라우저의 안전한 난수원에서 출발점을 받습니다. 아래는 로또 6/45를 같은 시드로 두 번 추첨한 결과입니다.

복권 랩 엔진의 시드별 처음 두 번의 로또 6/45 추첨 (각 시드로 5번씩 두 차례 돌려 모두 같았음)
시드1번째 추첨2번째 추첨되풀이해도 같은가
20266-8-10-24-33-436-12-14-19-29-42같음
20275-16-35-37-41-4418-19-27-30-38-41같음
lottoflick12-19-21-22-29-408-12-23-28-39-45같음

시드가 2026과 2027처럼 1만 달라도 결과는 아무 관계가 없습니다. 이웃한 시드가 이웃한 결과를 주지는 않습니다. 확인을 위해 시드 0부터 99,999까지(문자열)로 첫 추첨을 10만 번 뽑고 번호별 등장 횟수를 세었더니 기대값 13,333에 대해 가장 적은 번호가 13,093번, 가장 많은 번호가 13,480번이었고 카이제곱은 약 34.2로 균등한 추첨에서 나올 만한 수준이었습니다(자유도 44에 대한 근사).

같은 결과가 쓸모 있는 곳

시뮬레이션의 재현. 복권 랩은 시드를 정하면 같은 게임, 같은 표본 추출 방식, 같은 추첨 횟수에서 같은 집계가 나온다고 보고서에 적습니다. 다른 사람이 같은 결과를 확인할 수 있으므로 설명하는 글에 시드를 함께 적어 두면 독자가 직접 다시 돌려 볼 수 있습니다.

오류 찾기. 프로그램이 가끔 틀린 답을 내는데 난수 때문에 재현이 안 될 때, 시드를 고정하면 같은 오류를 몇 번이고 다시 낼 수 있습니다.

비교 실험. 두 방법을 비교할 때 같은 시드(같은 난수열)를 쓰면 난수의 운이 아닌 방법의 차이만 비교됩니다.

무엇이 같아야 같은 결과가 나오나

시드만 같다고 되는 것은 아닙니다. 시드로 얻는 것은 "같은 난수열"이고, 그 난수열을 번호로 바꾸는 방식이 같아야 같은 번호가 나옵니다. 위와 같은 시드 2026에서 나온 난수열을 나머지 연산(% 45 + 1)으로 번호로 바꾸면 33, 33, 4, 31, 33, 29가 나오는데, 이 방법은 같은 번호가 겹칠 수 있고 편향도 있습니다. 같은 난수에서 출발해도 번호로 바꾸는 방법이 다르면 결과가 전혀 다릅니다. 또 몇 번째 난수부터 쓰는지도 같아야 하고(4번째 추첨은 앞의 3번을 뽑은 뒤의 난수를 씁니다), 엔진의 버전이 같아야 합니다. 복권 랩 보고서가 표본 추출 방식의 버전을 함께 기록하는 이유입니다.

시드가 닿을 수 있는 범위

시드가 32비트 정수라면 서로 다른 시드는 4,294,967,296개뿐입니다. 로또 6/45의 조합 하나는 8,145,060가지이므로 한 번의 추첨은 시드 하나로 거의 모두 덮을 수 있습니다. 하지만 10번 연속 추첨한 결과의 가능한 순서쌍은 8,145,06010가지로 약 1069개입니다. 32비트 시드는 그중 43억 개에만 닿을 수 있어서, 시드가 바뀌어도 만들 수 없는 결과가 거의 전부입니다. 복권 랩은 시드 문자열을 128비트(32비트 네 개) 상태로 바꿔 훨씬 넓은 범위를 쓰지만, 사용자가 쓰는 짧은 문자열 시드(최대 64자)가 그만큼 다양하게 쓰일지는 사용자에 달려 있습니다.

시드가 겹칠 가능성도 있습니다. 서로 다른 사람이 각자 32비트 시드를 무작위로 정하면 생일 문제와 같은 구조로 겹침이 생깁니다. 1만 명이면 겹침이 한 번이라도 생길 확률이 1.2%, 10만 명이면 68.8%, 100만 명이면 사실상 1입니다(생일 문제의 계산과 같습니다).

직접 확인하기

아래 도구는 이 사이트 설명용으로 단순한 선형 합동 생성기(LCG)에 시드를 넣어 6개의 수를 만듭니다. 같은 시드는 언제나 같은 수를 내고, 아래 단추로 브라우저의 안전한 난수원에서 매번 다른 번호를 뽑을 수 있습니다.

이 도구는 자바스크립트가 필요합니다.

이 설명용 생성기에서 시드 2026은 33, 9, 32, 26, 24, 24를 내고 시드 2027은 8, 34, 34, 7, 9, 34를 냅니다. 24가 두 번, 34가 세 번 나오는 것에서 보듯 이 데모는 서로 다른 번호 6개를 뽑는 로또 추첨이 아니라 시드가 만드는 수열을 보여 주는 용도입니다. 같은 수가 반복될 수 있는 것도 이 때문입니다.

같은 결과가 위험한 곳

예측할 수 없어야 하는 곳에 시드를 예측할 수 있게 두면 문제가 됩니다. 시드가 시각이나 작은 정수 같은 것이면 누구든 같은 시드를 넣어 같은 수열을 만들 수 있습니다. 32비트 시드의 경우 4,294,967,296가지를 모두 시험해 보는 것은 보통 컴퓨터로 가능한 규모입니다. 그래서 비밀번호나 암호 키, 추첨의 공정성을 지켜야 하는 곳에는 시드를 공개 가능한 값으로 정하는 난수 생성기가 아니라 운영체제가 제공하는 보안 난수를 씁니다. 이 사이트의 번호 생성기는 브라우저의 보안 난수원을 쓴다는 점이 컴퓨터가 난수를 만드는 법에 코드를 근거로 설명되어 있고, 복권 랩도 시드를 비우면 보안 난수원에서 출발합니다.

또 추첨이 공정한지를 사람들이 믿으려면 보통 "예측 불가능"과 "사후 검증 가능" 두 가지가 필요한데, 시드는 둘 사이의 줄타기입니다. 시드를 추첨 전에 정해 공개해 두고(약속) 추첨 뒤에 같은 시드로 결과를 재현하게 하면 검증은 쉬워지지만, 시드를 정한 사람이 결과를 미리 알 수 있습니다. 시드를 누가 언제 어떻게 정하느냐가 공정성의 핵심이 됩니다(추첨이 공정하다는 것을 확인하는 법).

재현 가능한 결과를 남기려면

모의 실험 결과를 글이나 보고서에 적을 때 다른 사람이 같은 결과를 얻을 수 있게 하려면 다음을 함께 적어야 합니다. 첫째, 시드(문자열이라면 철자와 대소문자까지). 둘째, 어떤 게임의 어떤 규칙으로 돌렸는지(예: 로또 6/45, 45개 중 6개). 셋째, 몇 번 추첨했는지. 넷째, 표본 추출 방식과 프로그램의 버전. 이 네 가지 가운데 하나라도 다르면 같은 시드에서도 다른 결과가 나올 수 있습니다. 복권 랩의 JSON 보고서는 시드, 추첨 횟수, 방식의 버전을 함께 담도록 되어 있습니다.

시드를 적어 두면 나중에 "그때 나온 결과가 지금도 나오는가"로 프로그램이 의도대로 동작하는지도 확인할 수 있습니다. 이 사이트의 일부 테스트가 고정 시드의 결과를 값으로 못 박아 두는 것도 같은 이유입니다. 시드가 같은데 결과가 달라졌다면 코드가 바뀌었다는 신호입니다.

자주 나오는 질문

"시드를 고정한 결과도 무작위인가요?" 통계적인 의미에서는 무작위처럼 보이지만 같은 시드로 같은 결과가 나오므로 예측이 가능합니다. "겉모양이 무작위"와 "예측 불가능"은 다릅니다.

"좋은 시드, 나쁜 시드가 있나요?" 좋은 생성기라면 어떤 시드로 시작해도 통계적 성질이 같도록 만들어집니다. 위 실험에서도 이웃한 시드 10만 개의 첫 추첨이 균등하게 나왔습니다. 시드로 결과를 고르려는 시도는 없습니다. 시드를 바꿔 가며 마음에 드는 번호를 찾는 것은 번호를 직접 고르는 것과 같습니다.

이 엔진에만 해당하는 것

이 글의 수치는 복권 랩 엔진과 설명용 LCG를 이 사이트의 코드 그대로 돌려 얻은 것입니다. 엔진을 바꾸면 같은 시드의 결과도 바뀝니다. 32비트 시드를 모두 시험해 보는 일이 "보통 컴퓨터로 가능하다"는 것은 규모에 대한 일반적인 설명이며 이 글에서 시간을 재 보지는 않았습니다. 암호학적 안전성에 대한 일반 서술은 이 글의 범위를 넘으므로 자세히 다루지 않습니다.

출처와 확인 상태