> 乱数ジェネレーター <
// 暗号学的にランダムな整数や小数を生成 — あるいはシードを指定して再現可能な実行に
暗号学的乱数
デフォルトでは棄却サンプリングを用いた crypto.getRandomValues() を使用し、範囲内のすべての整数が等しい確率になります — モジュロバイアスはゼロです。
再現可能なシード付きモード
任意のシード文字列を指定すると、決定論的な mulberry32 PRNG に切り替わります。同じシードなら同じ数値 — テストやシミュレーションに最適です。
重複なしモード
Fisher-Yates 方式のサンプリングでユニークな整数を生成します。宝くじの抽選、福引きの抽選、または非復元抽出に最適です。
小数精度の制御
小数モードに切り替えて1〜10桁を選択します。数値は [min, max) にわたって一様に分布し、選択した精度に丸められます。
// 乱数生成について
仕組み:
シードフィールドが空の場合、このツールは crypto.getRandomValues(new Uint32Array(1)) を呼び出します。これはオペレーティングシステムのエントロピープールに支えられた CSPRNG(暗号学的に安全な PRNG)です。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つのユニークな数値
min=1, max=49, count=6, no-duplicates=on, sort=ascending
output:
7, 13, 22, 28, 35, 41
サイコロの代替 — d20を10回ロール(重複あり)
min=1, max=20, count=10, no-duplicates=off, sort=none
output:
14, 3, 20, 11, 7, 14, 2, 19, 8, 11
小数サンプリング — [0, 1) の浮動小数点数5つ、小数点以下4桁
type=decimal, min=0, max=1, count=5, places=4
output:
0.4172, 0.8635, 0.0291, 0.5508, 0.7723
シード付き再現可能 — 同じシードは同じシーケンスを生成
min=1, max=100, count=5, seed="hello" (2回実行)
output:
実行1: 39, 98, 64, 12, 71 / 実行2: 39, 98, 64, 12, 71
バケット分け — 整数モジュロによる100の重み付き A/B 選出
min=0, max=99, count=100, seed="experiment-42", sort=ascending
output:
0, 1, 3, 4, 7, 9, 12, ... 95, 97, 98, 99 (決定論的)
// 自分で実装する
アルゴリズムを自分のプロジェクトに直接組み込みたい場合は、このツールが基づいている3つのプリミティブを以下に示します。これらを合わせると、偏りのない暗号学的整数、決定論的なシード付きストリーム、任意の文字列シードを32ビット PRNG の状態に変換する処理がカバーされます。すべてパブリックドメインまたは MIT 相当です。
[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);
}
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
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 個のユニークな整数を要求し、k が n に近づくと、これはクーポンコレクター問題になります。最後の数回の抽選は指数関数的にコストが高くなります。このツールは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: 個数は1クリックあたり10,000個に制限されています。これによりスマートフォンでページの応答性が保たれ、非常に大きなテキストエリアに関するブラウザのエッジケースの挙動を回避できます。数百万の値が必要な場合は、異なるシードで複数のバッチを実行して出力を連結するか、アルゴリズムを Node スクリプトにコピーしてください — 同じ mulberry32 / cyrb53 のペアはサーバー側でも動作します。UX 上の理由から、並べ替え、コピー、ダウンロードはすべてクライアント側で行われるため、10k は最新のノートパソコンで1ミリ秒をはるかに下回る時間で完了する妥当な上限です。
Q: 私のデータはどこかにアップロードされますか?
A: いいえ。すべての操作はプレーンな JavaScript としてブラウザ内で実行されます: 数値の生成、並べ替え、統計、クリップボードへのコピー、.txt ファイルのダウンロード。GENERATE、COPY、DOWNLOAD をクリックしてもサーバーにリクエストは送信されません — ブラウザのネットワークタブで確認できます。シード、範囲、出力をログに記録することもありません。ページは CDN から HTTPS で配信される静的な HTML なので、入力に関するいかなる情報も当社が観測することはありません。これにより、機密のテストフィクスチャ、内部の宝くじシード、その他サードパーティのサーバーから遠ざけておきたいあらゆるものに対して安全に利用できます。
Q: 小数を生成するときに重複を避けられますか?
A: はい、重複なしチェックボックスはベストエフォートのリトライループを用いて小数にも適用されます。独立してサンプリングされた2つの浮動小数点数がビットレベルで衝突することはほとんどないため、範囲が精度に対して極端に小さい場合(例: min=0, max=1, places=2 は100個の異なる値しか持ちません)を除き、重複はまれです。ループが妥当な試行回数内に十分なユニークな値を見つけられない場合、ツールは容量エラーを報告するので、範囲を広げるか精度を上げることができます。厳密にユニークが保証された小数が必要な場合は、整数モードを使用して結果を自分で割ることをお勧めします。
Q: 数値リストの代わりに回転ホイールを使うべきなのはいつですか?
A: 数値リストはバッチ作業に最適です: 50枚の宝くじ券の抽選、テストデータの生成、シミュレーションへの供給など。回転ホイールは、一人が観客の前で1つの項目を選び、緊張感と視覚的な見せ場が欲しいときに適しています — 教室での名前の選出、ライブ配信のプレゼント、子供の家事のローテーション、意思決定会議など。それがあなたのユースケースであれば、まさにその瞬間のために作られたインタラクティブな回転ホイール UI を提供する randompickerwheel.app をご覧ください。両方のツールは同じ CSPRNG プリミティブから抽選します — 違いは見せ方であり、公平性ではありません。