핵심 요약
- 파이썬 기본 난수 생성기에서 동전 100번 연속 앞면이 출력되도록 만드는 정수 시드값을 역산하는 프로젝트 'TimeLord'가 공개되었습니다.
- 메르센 트위스터(MT19937)의 선형 연산과 파이썬 시드 초기화 과정을 역추적하여 조작이나 패치 없이 순수 정수 시드 하나로 이를 재현합니다.
- 결과를 먼저 정하고 시드를 역산하는 사후 선택 방식을 통해, 극단적으로 낮은 확률의 결과라도 독립적 무작위성을 뜻하는 것은 아님을 증명합니다.
요약 파이썬에서 동전을 던졌을 때 100번 연속으로 앞면(H)이 나오게 만드는 특정 시드(seed) 값을 역으로 역산해 찾아내는 오픈소스 프로젝트 'TimeLord'가 공개되었습니다. 일반적인 난수 생성기에서 공정한 동전 던지기로 100번 연속 앞면이 나올 확률은 약 7.9×10^-31에 불과하며, 1,000번 연속 앞면은 약 9.3×10^-302로 우주적으로 불가능에 가까운 극단적인 확률입니다.
하지만 이 프로젝트는 엄청난 행운에 기대는 대신 '사후 선택(post-selection)'의 역발상을 적용했습니다. 원하는 미래 결과(예: 동전 앞면 100번 연속)를 먼저 정해두고, 파이썬 기본 random 모듈의 의사 난수 생성기(PRNG)가 정확히 그 결과를 출력하도록 만드는 정수 시드 값을 거꾸로 계산해 내는 방식입니다.
파이썬(CPython)의 random 모듈은 메르센 트위스터(MT19937) 알고리즘을 사용합니다. 동전 던지기 함수인 `r.randrange(2)`는 내부적으로 `getrandbits(2)`를 호출해 32비트 출력 중 상위 2비트를 추출하는데, 이 비트가 '01'이 되도록 제한하면 1(앞면)이 확정 출력됩니다. MT19937의 내부 비트 연산은 2원소 유한체(GF(2)) 상의 선형 방정식(XOR 기반)으로 표현할 수 있어, 100번의 앞면에 필요한 200개의 비트 제약 조건 방정식을 풀고 남은 자유 비트를 채워 원하는 상태(state)를 만들어냅니다.
특히 TimeLord는 내부 상태를 직접 덮어쓰는 `random.setstate()` 꼼수나 몽키 패칭을 전혀 쓰지 않습니다. 대신 파이썬이 거대한 정수 시드를 32비트 워드로 쪼개 메르센 트위스터 상태 배열을 초기화하는 과정(init_by_array)까지 전부 역연산하여, 순수한 하나의 거대 정수 시드값(`seed = <아주 큰 정수>`)으로 조합해 냅니다. 누구나 이 정수 시드를 받아 순수 파이썬 환경의 `random.Random(seed)`에 넣고 실행하기만 하면 조작 없이 완벽하게 재현되는 100번(최대 1,000번) 연속 앞면 결과를 볼 수 있습니다. 제작자는 이를 통해 재현 가능성이 독립적이고 무작위로 선택된 시드임을 보증하지 않으며, 사후 선택 편향의 원리를 보여주는 데모라고 설명했습니다.
Sponsored · 광고