この生成ツールの乱数の作り方
初期設定では、ブラウザのcrypto.getRandomValues(OSの暗号用乱数生成器を使うWeb Crypto API)から乱数を得ます。整数の範囲では、範囲に必要なビット数だけ乱数を受け取り、範囲を超えた値は捨てて引き直す棄却サンプリングで、すべての数が完全に同じ確率になるようにしています。 「重複なし」はフィッシャー–イェーツ法の部分シャッフルで処理します。暗号用乱数のチェックを外すと、JavaScript標準のMath.random()に切り替わります。 2つを比べられるようにしているのは、くじ引きや日常の抽選では違いを感じないものの、どんな用途で差が意味を持つのかを知っておいてほしいからです。 パスワードやトークンなど安全性が必要な値は、この画面に表示した数字ではなく、パスワード生成機やUUID生成ツールのような専用ツールで作ってください。
疑似乱数と暗号用乱数の違い
コンピュータの乱数の多くは疑似乱数です。小さな内部状態から計算式で次の値を作り続けるため、見た目はランダムでも、状態が分かれば以降の値をすべて予測できます。Math.random()は速度と統計的な品質を目的に作られており、予測のしにくさは保証されていません。アルゴリズムは実装ごとに異なり、ChromeやEdgeのV8ではxorshift128+(128ビットの状態)が使われてきました。 一方crypto.getRandomValuesは、OSの暗号学的に安全な乱数生成器を使うよう規定されており、過去の出力を知っていても次の値を計算できないように作られています。
| Math.random() | crypto.getRandomValues | |
|---|---|---|
| 性質 | 疑似乱数(統計と速度が中心) | 暗号学的に安全な乱数 |
| 予測のしやすさ | 十分な出力から内部状態を推定できる | 予測できないことを目標に設計 |
| シード指定・再現 | 不可(ブラウザが設定) | 不可 |
| 向いている用途 | ゲーム、シミュレーション、気軽な抽選 | トークン、鍵、パスワード、公平性が大切な抽選 |
このページではどちらもシードを指定して同じ結果を再現することはできません。実験の再現やテストデータが必要なら、シードを受け取る疑似乱数ライブラリを自分のコードで使ってください。 逆に抽選では、結果を事前に調べたりやり直したりできないことが利点になります。
剰余バイアス:「乱数 % 範囲」はなぜ偏るのか
32ビットの乱数(0〜4,294,967,295、全部で232通り)を範囲の大きさNで割った余りに変える方法はよくある落とし穴です。232がNの倍数でないと、余りr個の値には元の値が1つ多く対応するため、小さい数のほうがごくわずかに出やすくなります。 サイコロ(N=6)では232 = 6 × 715,827,882 + 4なので、1〜4は5・6より715,827,883/715,827,882倍、つまり約10億分の1.4だけ多く出ます。実害はありませんが、範囲が大きくなると差は急に広がります。
| 範囲の大きさN | 232 mod N (r) | 出やすい数の割合 | その分の増加率 | 53ビット小数方式の誤差上限(N/253) |
|---|---|---|---|---|
| 6 | 4 | 66.67% | +1.4e-7% | 6.7e-16 |
| 45 | 31 | 68.89% | +1.0e-6% | 5.0e-15 |
| 100 | 96 | 96.00% | +2.3e-6% | 1.1e-14 |
| 1,000 | 296 | 29.60% | +2.3e-5% | 1.1e-13 |
| 1,000,000 | 967,296 | 96.73% | +0.023288% | 1.1e-10 |
| 1,000,000,000 | 294,967,296 | 29.50% | +25.00% | 1.1e-7 |
範囲が10億なら、全体の約29.50%の値が他より25.00%多く出ることになり、はっきりした偏りです。このツールはそれを避けるため、たとえばN=100なら7ビット(0〜127)の乱数を受け取り、100以上なら捨てて引き直します。捨てる確率は常に50%未満で、平均2回以内に決まり、すべての値が完全に同じ確率になります。Math.random()モードはMath.floor(Math.random() * N)で、生成される小数が53ビットのため偏りの上限はN/253程度(表の最後の列)です。範囲が232以下なら無視できる大きさで、それを超える範囲ではMath.randomを使わず自動的に暗号用乱数に切り替えます。
整数と小数の範囲の注意点
整数モードは最小値と最大値をどちらも含みます。1〜6なら範囲の大きさは6で、各数の確率は1/6です。範囲の大きさは(最大値 − 最小値 + 1)で求め、−10〜10のような負の範囲も同じ式です。 よくある間違いはMath.floor(Math.random() * (max - min)) + minと書くことで、これではmaxが出ません。
小数モードは[0,1)の一様乱数に(最大値 − 最小値)を掛けて最小値を足し、指定した桁で丸めます。丸めの影響で最大値が出ることがあり、桁数が少ないほど同じ値が重なりやすくなります。 たとえば0〜1を小数1桁で引くと候補は0.0〜1.0の11通りですが、両端は丸めの区間が半分しかないため、他の半分の確率でしか出ません。すべての候補を同じ確率で引きたいなら、0〜10の整数を引いて10で割ってください。小数モードでは「重複なし」は使えません。
重複あり・なしの違い
重複あり(復元抽出)は、毎回同じ条件で引き直すので、同じ数が2回出てもおかしくありません。引く個数が増えるほど、重なるのはむしろ自然なことです。
| 範囲の大きさN | 引く個数k | 1組でも重なる確率 |
|---|---|---|
| 45 | 6 | 29.4% |
| 100 | 10 | 37.2% |
| 365 | 23 | 50.7% |
| 1,000 | 50 | 71.2% |
| 1,000,000 | 1,000 | 39.3% |
1〜100から重複ありで10個引くと、少なくとも1組が重なる確率は37.2%です。有名な「誕生日のパラドックス」も同じ計算で、365日で23人なら50.7%と半分を超えます。 「重なったから乱数がおかしい」という判断はほとんどの場合まちがいです。当選番号や座席番号のように重なってはいけない場面では「重複なし」にチェックしてください。
重複なし(非復元抽出)は、範囲の全値を並べた配列に対し、先頭から順にi番目と「iから末尾までのどこか」を一様に選んで入れ替える操作をk回行い、先頭のk個を結果にします。こうするとk個の順序つき組み合わせがすべて同じ確率になります。 範囲が100万を超えるときは配列を作らず、すでに出た値を覚えて重なったら引き直す方式に切り替えますが、このツールの上限は1,000個なので偏りは問題になりません。
計算例
例1: 1〜45から重複なしで6個。 順序を無視した組み合わせはC(45,6) = 8,145,060通りで、どの組も確率は1/8,145,060です。順序も区別すれば6! = 720倍の5,864,443,200通り。 「1,2,3,4,5,6」が出る確率は「7,13,21,30,38,44」とまったく同じで、きれいに並んだ組が出にくい理由はありません。番号選びに特化したツールは抽選番号ジェネレーターをご覧ください。
例2: 1〜45から重複ありで6個。 順序つきの結果は456 = 8,303,765,625通りなので、特定の並びが再び出る確率は1.20e-10です。6個のうち少なくとも1組が重なる確率は29.38%(上の表の1行目)。
例3: 10〜19から重複なしで3個。 範囲の大きさは19 − 10 + 1 = 10、順序つきの結果は10 × 9 × 8 = 720通りです。3つの数は必ず異なり、合計は最小10+11+12 = 33から最大17+18+19 = 54の間に収まります。表示された合計がこの範囲を外れたら異常のサインです。
よくある誤解
- 「さっき4が出たから、次は4が出にくい」: 各回は独立で、直前の結果は次の確率に影響しません(ギャンブラーの誤謬)。
- 「気に入る結果が出るまで引き直せば公平」: 引き直しを繰り返すと公平さは失われます。回数を先に決めて、最初の結果を採用してください。
- 「並べ替えるとランダムでなくなる」: 並べ替えは表示順が変わるだけで、どの数が選ばれたかは変わりません。ただし1等・2等のように出た順に意味がある抽選では並べ替えないでください。
- 小数モードの値を金額や正確な確率にそのまま使う: 浮動小数点は2進数の近似値なので、合計に微小な誤差が出ることがあります。
このツールを使ってはいけない場合
法的な効力を持つ景品の抽選には、立会人・記録・第三者による確認といった公平性の証明が必要で、このページはそれを提供しません。賭け事の用途にも使えません。パスワード、ワンタイムコード、暗号鍵を画面に表示した数字で作るのもやめてください。 数字はブラウザのメモリ上で生成され、このページから送信・保存されることはありません。シードがないため同じ結果を後から再現することもできないので、記録が必要なときは結果をコピーしておいてください。
結果の活用方法
くじ引きなら、参加者の番号の最小・最大を範囲に入れ、「重複なし」にチェックして当選人数分を引きます。グループを分けるならランダムチーム分け、結果を1つずつ割り当てるならあみだくじ、サイコロやコインのような小さな範囲の繰り返しはコイントス & サイコロ振りが手軽です。 シミュレーションでは個数を増やし、合計や平均が期待値に近づくか確かめられます。1〜100の一様な整数の期待平均は50.5で、標本が大きいほどこの値に近づきます。
よくある質問
「重複なし」はいつ使いますか?
当選番号、座席番号、ロトの番号のように、同じ数が2回出てはいけないときに使います。範囲の大きさより多い個数(たとえば1〜10から11個)は不可能なので、エラーが表示されます。
この数字は本当にランダムですか?
コンピュータが作る乱数は、厳密にはアルゴリズムとOSが集めた偶然性に基づくものです。初期設定の暗号用乱数は予測が非常に難しく、抽選・ゲーム・学習用途には十分です。チェックを外して使うMath.randomは統計的には問題ありませんが、予測されにくさは保証されないため、セキュリティ用途には向きません。
同じ設定で続けて同じ数が出ました。故障ですか?
故障ではありません。範囲が小さいほど偶然同じ数になりやすく、1〜6で2回続けて同じ数が出る確率は1/6(約16.7%)です。
シードを指定して同じ結果を出せますか?
いいえ。どちらの乱数もブラウザが管理しているため、シードは指定できません。再現性が必要なテストや実験では、シードを受け取る疑似乱数ライブラリを使ってください。
小数モードで最大値が出ることはありますか?
あります。内部の値は最大値未満ですが、指定の桁で丸めると表示が最大値と同じになることがあります。含む・含まないを厳密にしたいときは整数モードを使ってください。
一度にいくつまで引けますか?
1回につき最大1,000個です。整数で正確に表せる大きさ(253未満)を超える範囲には対応していません。
関連ツール
- 抽選番号ジェネレーター - 6個選ぶ番号の自動選択
- コイントス & サイコロ振り - 小さな範囲の繰り返し実験
- ランダムチーム分け - グループをランダムに分ける
- パスワード生成機 - 秘密の値はこちらで作成