Xoshiro256** 난수 생성기
64비트 워드 4개짜리 상태를 넣으면 xoshiro256**의 다음 상태와 출력값을 그대로 계산합니다. 정수 시드 하나로 SplitMix64를 돌려 상태를 채울 수도 있고, 첫 출력이 나오는 곱셈·회전 과정을 숫자 그대로 풀어 보여 줍니다.
10개 출력 중 첫 값
11520
16진수 0000000000002d00
출력 수열
| # | 10진수 | 16진수 |
|---|---|---|
| 0 | 11520 | 0000000000002d00 |
| 1 | 0 | 0000000000000000 |
| 2 | 1509978240 | 000000005a007080 |
| 3 | 1215971899390074240 | 10e0000000009d80 |
| 4 | 1216172134540287360 | 10e0b61ce1009d80 |
| 5 | 607988272756665600 | 0870021ce143ad00 |
| 6 | 16172922978634559625 | e071c3c2e143f089 |
| 7 | 8476171486693032832 | 75a1690ef7a20380 |
| 8 | 10595114339597558777 | 9309685b465c23f9 |
| 9 | 2904607092377533576 | 284f3cc2e13e3c88 |
첫 출력이 나오는 과정 — result = rotl(s1 × 5, 7) × 9
s1 = 2
× 5 = 10
rotl(·, 7) = 1280
× 9 = 11520
사용 방법
- 14워드를 직접 넣거나, 정수 시드 하나로 SplitMix64를 돌려 상태를 채웁니다.
- 2출력 개수를 정합니다.
- 3출력 수열을 10진수·16진수로 확인합니다.
- 4첫 출력이 rotl(s1 × 5, 7) × 9로 나오는 과정을 숫자 그대로 봅니다.
자주 묻는 질문
64비트 워드 4개(s0~s3)가 상태입니다. 매 걸음마다 result = rotl(s1 × 5, 7) × 9로 출력을 만들고, 그와 별도로 s0~s3를 XOR과 시프트만으로 다음 상태로 갱신합니다. 출력과 상태 갱신이 서로 다른 계산이라는 점이 핵심입니다.
출력을 만드는 마지막 단계가 곱셈-회전-곱셈(× 5 → rotl 7 → × 9)이기 때문입니다. 이런 마무리를 "스타스타(⁎⁎) 스크램블러"라고 부르며, 상태 갱신에 XOR·시프트만 쓰는 xoshiro 계열 이름 뒤에 붙어 xoshiro256**처럼 씁니다.
정수 시드 하나만 있을 때는 SplitMix64라는 별도의 간단한 생성기를 4번 돌려 4워드를 채우는 것이 원 저자의 권장 방식입니다. 4워드를 손으로 아무렇게나 넣으면 초기 상태들 사이에 우연한 상관관계가 생겨 통계 품질이 떨어질 수 있습니다.
모든 연산이 XOR·시프트·곱셈뿐이라 상태가 전부 0이면 다음 상태도 전부 0이 되어 영원히 이 상태에서 못 벗어납니다("흡수 상태"). 4워드를 직접 넣을 때만 생길 수 있는 문제이며, SplitMix64로 시딩하면 입력이 0이어도 이 상태에 빠지지 않습니다.
Xorshift는 32비트나 64비트 상태 하나에 시프트+XOR 세 번만 반복하는 원조 격 생성기입니다. Xoshiro256**은 상태를 256비트(64비트 워드 4개)로 늘리고 출력에 곱셈 스크램블러를 더해 비슷한 속도로 훨씬 좋은 통계 품질과 2²⁵⁶−1의 긴 주기를 얻습니다.
안 됩니다. 상태 갱신이 선형 연산(XOR·시프트)이라 연속된 출력 몇 개만 있으면 내부 상태를 역산할 수 있습니다. 통계 시뮬레이션·게임 등 비암호 용도로만 써야 합니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.
알아두면 좋은 점
- 알고리즘은 David Blackman·Sebastiano Vigna의 xoshiro256** 참조 구현(xoshiro.di.unimi.it)을 그대로 옮긴 Rust rand_xoshiro 크레이트(rust-random/rngs)의 소스를 받아 한 줄씩 대조해 옮겼습니다.
- 정답지는 같은 크레이트의 공식 테스트에 실린 값입니다 — 상태를 [1,2,3,4]로 직접 넣었을 때 나오는 출력 10개, 그리고 SplitMix64를 시드 1477776061723855037로 돌렸을 때 나오는 값 50개를 그대로 대조해 전부 일치를 확인했습니다.
- 상태가 전부 0이면 영원히 0만 나오는 흡수 상태가 되는지, SplitMix64로 시딩하면 시드 0에서도 이 상태에 빠지지 않는지 별도로 검사합니다.
- 한 걸음의 출력·다음 상태가 항상 64비트 범위(0 ~ 2⁶⁴−1) 안에 있는지, 같은 시드가 항상 같은 수열을 내는지도 검사합니다.
- 64비트 연산은 JS의 number(53비트까지만 안전)로는 정확할 수 없어 전부 BigInt로 계산합니다.
- 출력은 최대 30개까지 만듭니다. 비암호용 의사난수 생성기이며 보안이 필요한 곳에는 쓰면 안 됩니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 8일 · 결과는 참고용 추정치입니다.