랜덤 | 시드 | 재현 가능

> 난수 생성기 <

// 암호학적으로 랜덤한 정수와 소수를 생성하세요 — 또는 시드를 지정해 재현 가능한 실행을 하세요

[CRYPTO]

암호학적 무작위성

기본적으로 기각 샘플링을 사용하는 crypto.getRandomValues()를 적용하여 범위 내의 모든 정수가 동일한 확률을 갖도록 합니다 — 모듈로 편향이 전혀 없습니다.

[SEEDED]

재현 가능한 시드 모드

임의의 시드 문자열을 입력하면 결정론적인 mulberry32 PRNG로 전환됩니다. 같은 시드, 같은 숫자 — 테스트와 시뮬레이션에 완벽합니다.

[NO-DUP]

중복 없음 모드

Fisher-Yates 방식 샘플링으로 고유한 정수를 생성합니다. 복권 추첨, 경품 추첨 또는 비복원 추출에 적합합니다.

[DECIMALS]

소수 정밀도 제어

소수 모드로 전환하고 1~10자리를 선택하세요. 숫자는 [최솟값, 최댓값) 범위에 균등하게 분포하며 선택한 정밀도로 반올림됩니다.

// 난수 생성에 대하여

작동 방식:

시드 필드가 비어 있으면 이 도구는 운영 체제의 엔트로피 풀로 구동되는 CSPRNG(암호학적으로 안전한 PRNG)인 crypto.getRandomValues(new Uint32Array(1))를 호출합니다. 32비트 부호 없는 정수를 모듈로 편향 없이 임의의 [min, max] 범위에 매핑하기 위해 생성기는 기각 샘플링을 사용합니다. 2^32에 들어맞는 범위의 가장 큰 배수를 초과하는 추출값은 모두 폐기되고 다시 추출됩니다. 시드를 제공하면 문자열은 cyrb53으로 32비트 정수로 해시되어 mulberry32에 입력됩니다. mulberry32는 주기가 2^32인 빠른 32비트 PRNG로, 결정론적이며 재현 가능합니다. 소수 모드는 균등한 [0,1) 샘플을 [min, max)로 스케일링한 다음 toFixed(places)로 형식을 지정합니다.

예시:

min=1, max=100, count=5, seed="hello" -> 39, 98, 64, 12, 71 (항상)

표준 및 참고 자료:

  • >Web Crypto API (W3C) — CSPRNG를 위한 crypto.getRandomValues() 계약
  • >RFC 4086 — Randomness Requirements for Security
  • >mulberry32 — Tommy Ettinger의 32비트 PRNG, 퍼블릭 도메인
  • >cyrb53 — 시드 생성을 위한 빠른 53비트 문자열 해시(bryc, 퍼블릭 도메인)

일반적인 사용 사례:

  • >증명 가능하게 고유한 추첨을 갖춘 복권 및 경품 추첨
  • >설문 조사 및 감사를 위한 비복원 무작위 추출
  • >몬테카를로 시뮬레이션 및 통계 실험
  • >재현 가능한 시드 할당을 통한 A/B 테스트 버킷 분할
  • >게임 메커니즘: 주사위 대체, 전리품 테이블, 레벨 시드
  • >QA 테스트 데이터 및 퍼징 입력 생성
  • >회의에서 당첨자, 심사위원 또는 첫 발표자 선정
  • >프로토타입 및 데모를 위한 합성 데이터 생성

관련 도구:

  • >UUID 생성기 — 숫자가 아닌 고유 ID가 필요할 때 사용하는 랜덤 v4 식별자
  • >비밀번호 생성기 — 문자 풀을 제어할 수 있는 암호학적으로 랜덤한 문자열
  • >BIP39 생성기 — 암호화폐 지갑용 랜덤 니모닉 시드 구문
  • >randompickerwheel.app — 라이브 관객이나 어린이 교실을 위한 시각적 랜덤 선택기를 원할 때 사용하는 돌림판 UI

// 출력 예시

복권 추첨 — 1-49에서 6개의 고유한 숫자

config: min=1, max=49, count=6, no-duplicates=on, sort=ascending

output:

7, 13, 22, 28, 35, 41

주사위 대체 — d20 열 번 굴리기(중복 허용)

config: min=1, max=20, count=10, no-duplicates=off, sort=none

output:

14, 3, 20, 11, 7, 14, 2, 19, 8, 11

소수 샘플링 — 소수점 4자리로 [0, 1)의 부동소수점 5개

config: type=decimal, min=0, max=1, count=5, places=4

output:

0.4172, 0.8635, 0.0291, 0.5508, 0.7723

시드 재현 가능 — 같은 시드는 같은 시퀀스를 생성

config: min=1, max=100, count=5, seed="hello" (두 번 실행)

output:

실행 1: 39, 98, 64, 12, 71 / 실행 2: 39, 98, 64, 12, 71

버킷 분할 — 정수 모듈로를 통한 100개의 가중치 A/B 선택

config: min=0, max=99, count=100, seed="experiment-42", sort=ascending

output:

0, 1, 3, 4, 7, 9, 12, ... 95, 97, 98, 99 (결정론적)

// 직접 구현하기

알고리즘을 자신의 프로젝트에 직접 넣고 싶다면, 이 도구가 기반으로 하는 세 가지 기본 요소를 여기에 소개합니다. 이들을 합치면 편향 없는 암호학적 정수, 결정론적 시드 스트림, 임의의 문자열 시드를 32비트 PRNG 상태로 변환하는 것까지 모두 다룹니다. 모두 퍼블릭 도메인 또는 MIT 동등입니다.

[JavaScript]

[min, max]의 암호학적으로 안전한 정수(모듈로 편향 없음)

function secureRandomInt(min, max) {
  const range = max - min + 1;
  const buf = new Uint32Array(1);
  const max32 = 0xFFFFFFFF;
  const limit = Math.floor((max32 + 1) / range) * range;
  let v;
  do {
    crypto.getRandomValues(buf);
    v = buf[0];
  } while (v >= limit);
  return min + (v % range);
}
[JavaScript]

mulberry32 — 결정론적 시드 PRNG(32비트 상태, 약 2^32 주기)

function mulberry32(seed) {
  let a = seed >>> 0;
  return function () {
    a = (a + 0x6D2B79F5) | 0;
    let t = a;
    t = Math.imul(t ^ (t >>> 15), t | 1);
    t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}

// usage: const rng = mulberry32(0xC0FFEE);
//        rng(); // 0.6743..., reproducible across runs
[JavaScript]

cyrb53 — 빠른 문자열-32비트 해시(mulberry32 시드 생성에 사용)

function cyrb53(str, seed) {
  seed = seed || 0;
  let h1 = 0xdeadbeef ^ seed;
  let h2 = 0x41c6ce57 ^ seed;
  for (let i = 0; i < str.length; i++) {
    const ch = str.charCodeAt(i);
    h1 = Math.imul(h1 ^ ch, 2654435761);
    h2 = Math.imul(h2 ^ ch, 1597334677);
  }
  h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^
       Math.imul(h2 ^ (h2 >>> 13), 3266489909);
  h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^
       Math.imul(h1 ^ (h1 >>> 13), 3266489909);
  return (h1 >>> 0);
}

// const rng = mulberry32(cyrb53('my-seed-string'));

// 흔한 함정

> 모듈로 편향

순진한 Math.floor(Math.random() * range)는 범위가 2의 거듭제곱이 아닐 때 상위 비트를 고르지 않게 분배합니다 — 일부 출력이 다른 것보다 약간 더 자주 나타납니다. 기각 샘플링(위 스니펫)을 사용하여 범위를 벗어난 추출값을 폐기하고 분포를 균등하게 유지하세요.

> Math.random()은 암호학적으로 안전하지 않습니다

Math.random()은 V8/Spidermonkey에서 xorshift128+를 사용하는데, 이는 빠르지만 예측 가능합니다. 몇 개의 출력을 관찰한 공격자는 내부 상태를 복원하고 미래 값을 예측할 수 있습니다. 토큰, 솔트, 공정성이 중요한 복권 추첨 또는 공격자가 관심을 가질 만한 모든 것에는 항상 crypto.getRandomValues()를 사용하세요.

> 시드 PRNG는 결정론적입니다 — 보안에 절대 사용하지 마세요

Mulberry32 및 유사한 것들은 반복되도록 설계되었습니다. 그것은 테스트, 시뮬레이션, 버킷 분할에는 바로 원하는 바이지만, 비밀번호 재설정 토큰이나 세션 ID에는 바로 원하지 않는 바입니다. 시드를 사용자에게 노출되는 부분이나 인증과 관련된 부분에 전달하고 있다면 즉시 CSPRNG로 되돌리세요.

> 높은 개수에서의 중복 기각은 용량을 소진합니다

크기 n의 범위에서 k가 n에 근접하는 k개의 고유한 정수를 요청하는 것은 쿠폰 수집가 문제가 됩니다. 마지막 몇 개의 추출은 기하급수적으로 비싸집니다. 이 도구는 10,000개로 제한하고 부분 Fisher-Yates 샘플링을 사용하여 용량이 정확하지만, seen.has(x)를 사용하는 순진한 while 루프는 k > n일 때 조용히 멈춥니다. 항상 용량을 미리 확인하세요.

>> 자주 묻는 질문

Q: 이 난수 생성기는 암호학적으로 안전한가요?

A: 네, 기본적으로 그렇습니다. SEED 필드를 비워 두면 이 도구는 Web Crypto API의 CSPRNG인 crypto.getRandomValues()를 사용합니다. 이는 Linux/macOS에서는 /dev/urandom에서, Windows에서는 BCryptGenRandom에서 읽습니다. 또한 기각 샘플링을 적용하여 32비트 정수에서 사용자 지정 범위로의 매핑이 편향되지 않습니다. 출력은 토큰 생성, 솔트 선택, 공정한 복권 실행과 같은 보안 관련 작업에 적합합니다. 시드를 제공하면 결정론적 PRNG(mulberry32)로 전환되며, 이는 암호학적으로 안전하지 않습니다 — 비밀성보다 재현성이 더 중요할 때만 사용하세요.

Q: 시드 모드와 시드 없음 모드의 차이는 무엇인가요?

A: 시드 없음 모드(기본값)는 브라우저의 CSPRNG를 사용하며 클릭할 때마다 새롭고 예측 불가능한 숫자를 생성합니다 — 같은 호출이 같은 시퀀스를 두 번 반환하는 일은 결코 없습니다. 시드 모드는 cyrb53으로 시드 문자열을 32비트 정수로 해시하여 결정론적 PRNG인 mulberry32에 입력합니다. 동일한 시드와 동일한 설정은 항상 동일한 시퀀스를 생성하며, 이는 재현 가능한 실험, 확률적 코드 디버깅, 테스트 픽스처 공유, 또는 모든 사용자가 항상 같은 버킷에 들어가야 하는 A/B 테스트 버킷 분할에 매우 유용합니다.

Q: 중복 없음 옵션은 어떻게 작동하나요?

A: 정수의 경우 중복 없음은 [min..max] 범위에서 Fisher-Yates에서 영감을 받은 부분 셔플을 사용하여 추출하며, 결코 반복하지 않고 처음 k개의 요소를 반환합니다. 희소 교환 맵을 사용하므로 메모리 사용량이 O(range)가 아닌 O(count)로 유지됩니다. 즉, 1부터 1,000,000까지에서 고유한 숫자 10개를 추출하는 것은 1부터 100까지에서 10개를 추출하는 것만큼 저렴합니다. 범위가 제공할 수 있는 것보다 더 많은 고유한 숫자를 요청하면(예: 1~10에서 고유한 정수 20개), 도구는 무한히 반복하는 대신 명확한 용량 오류를 보고합니다.

Q: 소수(부동소수점) 난수를 생성할 수 있나요?

A: 네. TYPE 라디오를 소수로 설정하고 1에서 10자리 사이의 정밀도를 선택하세요. 생성기는 [0, 1)의 균등한 부동소수점을 추출하여 [min, max)로 스케일링한 다음 toFixed(places)로 반올림하고 다시 숫자로 파싱합니다. 소수 모드에서는 max가 배타적이라는 점에 유의하세요(부동소수점 균등성이 정의되는 방식의 부작용입니다). 대부분의 통계 용도에서는 소수점 4~6자리면 충분합니다. 10자리는 일반적인 작은 범위에서 IEEE 754 배정밀도의 한계에 근접합니다.

Q: 최대 개수가 있나요?

A: 개수는 클릭당 10,000개로 제한됩니다. 이는 휴대폰에서 페이지의 반응성을 유지하고 매우 큰 텍스트 영역과 관련된 브라우저의 경계 사례 동작을 방지합니다. 수백만 개의 값이 필요한 경우 서로 다른 시드로 여러 배치를 실행하여 출력을 연결하거나, 알고리즘을 Node 스크립트에 복사하세요 — 동일한 mulberry32 / cyrb53 쌍은 서버 측에서도 작동합니다. UX 상의 이유로 정렬, 복사, 다운로드는 모두 클라이언트 측에서 이루어지므로, 10k는 최신 노트북에서 1밀리초 훨씬 이내에 완료되는 합리적인 상한입니다.

Q: 제 데이터가 어딘가로 업로드되나요?

A: 아니요. 모든 작업은 일반 JavaScript로 브라우저에서 실행됩니다: 숫자 생성, 정렬, 통계, 클립보드 복사, .txt 파일 다운로드. GENERATE, COPY, DOWNLOAD를 클릭해도 당사 서버로 요청이 전송되지 않습니다 — 브라우저의 네트워크 탭에서 확인할 수 있습니다. 시드, 범위, 출력을 기록하지도 않습니다. 페이지는 CDN에서 HTTPS로 제공되는 정적 HTML이므로, 입력에 관한 어떤 것도 당사에서 관찰할 수 없습니다. 이로 인해 이 도구는 기밀 테스트 픽스처, 내부 복권 시드, 또는 타사 서버에서 멀리 두고 싶은 그 밖의 모든 것에 안전합니다.

Q: 소수를 생성할 때 중복을 피할 수 있나요?

A: 네, 중복 없음 체크박스는 최선의 노력 재시도 루프를 사용하여 소수에도 적용됩니다. 독립적으로 샘플링된 두 부동소수점은 비트 수준에서 거의 충돌하지 않으므로, 범위가 정밀도에 비해 매우 작은 경우(예: min=0, max=1, places=2는 100개의 고유한 값만 가짐)를 제외하고는 중복이 드뭅니다. 루프가 합리적인 시도 횟수 내에 충분한 고유 값을 찾지 못하면 도구는 용량 오류를 보고하므로 범위를 넓히거나 정밀도를 높일 수 있습니다. 엄격하게 고유함이 보장된 소수가 필요한 경우 정수 모드를 사용하고 결과를 직접 나누는 것을 권장합니다.

Q: 숫자 목록 대신 돌림판을 언제 사용해야 하나요?

A: 숫자 목록은 일괄 작업에 가장 적합합니다: 복권 50장 추첨, 테스트 데이터 생성, 시뮬레이션 공급. 돌림판은 한 사람이 관객 앞에서 한 항목을 선택하고 긴장감과 시각적 효과를 원할 때 더 좋습니다 — 교실 이름 선정, 라이브 스트림 경품, 어린이 집안일 순환, 의사 결정 회의 등. 그것이 사용 사례라면, 바로 그 순간을 위해 만들어진 인터랙티브 돌림판 UI를 제공하는 randompickerwheel.app을 참조하세요. 두 도구 모두 동일한 CSPRNG 기본 요소에서 추출합니다 — 차이는 표현 방식이며 공정성이 아닙니다.

// OTHER LANGUAGES