도구스개발

Xoshiro256** 난수 생성기

64비트 워드 4개짜리 상태를 넣으면 xoshiro256**의 다음 상태와 출력값을 그대로 계산합니다. 정수 시드 하나로 SplitMix64를 돌려 상태를 채울 수도 있고, 첫 출력이 나오는 곱셈·회전 과정을 숫자 그대로 풀어 보여 줍니다.

10개 출력 중 첫 값

11520

16진수 0000000000002d00

출력 수열

#10진수16진수
0115200000000000002d00
100000000000000000
21509978240000000005a007080
3121597189939007424010e0000000009d80
4121617213454028736010e0b61ce1009d80
56079882727566656000870021ce143ad00
616172922978634559625e071c3c2e143f089
7847617148669303283275a1690ef7a20380
8105951143395975587779309685b465c23f9
92904607092377533576284f3cc2e13e3c88

첫 출력이 나오는 과정 — result = rotl(s1 × 5, 7) × 9

s1 = 2
× 5 = 10
rotl(·, 7) = 1280
× 9 = 11520

상태 갱신과 출력은 서로 다른 계산입니다. 출력(result)은 갱신 전의 s1에 곱셈·회전·곱셈만 적용해 만들고("**" 스크램블러), 다음 상태(s0..s3)는 그와 별도로 XOR과 시프트만으로 갱신됩니다. 두 계산이 얽혀 있지 않아서 32비트 워드 4개, 64비트 워드 4개처럼 워드 크기만 다른 변종도 같은 틀로 설명됩니다.
dev/xorshift-random과 무엇이 다른가. Xorshift(32비트 상태 1개)는 시프트+XOR 세 번이 전부라 가볍지만 통계 결함이 있습니다. Xoshiro256**은 상태를 256비트(64비트 워드 4개)로 늘리고 출력에 곱셈 스크램블러("**")를 더해, 비슷한 속도로 훨씬 좋은 통계 품질과 2²⁵⁶−1의 긴 주기를 얻습니다. 다만 암호용은 아닙니다 — 선형 연산이 섞여 있어 출력 몇 개로 내부 상태를 복원할 수 있습니다.
정수 시드 하나만 쓰려면 SplitMix64로 4워드를 채우는 방식을 권합니다. 원 저자가 권장하는 방법이며, 4워드를 손으로 아무 값이나 넣으면 짝을 이루는 초기 상태들 사이에 생각지 못한 상관관계가 생길 수 있습니다.

사용 방법

  1. 14워드를 직접 넣거나, 정수 시드 하나로 SplitMix64를 돌려 상태를 채웁니다.
  2. 2출력 개수를 정합니다.
  3. 3출력 수열을 10진수·16진수로 확인합니다.
  4. 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일 · 결과는 참고용 추정치입니다.