乱数生成
計算結果
抽選された数字
- 取りうる値
- 100
- 少なくとも1つ重複する確率
- 9.65%
乱数生成は、出発点を、指定した範囲の中の整数の一覧に変えます。このページは範囲、欲しい個数、そして始めるシードを受け取り、ちょうどその個数の整数を返します。同じシードを使えばいつも同じ数が出るので、作った一覧を誰かに渡して同じものを再現してもらえます。重複を切ると、結果は並びではなく選び出した集合になり、同じ値が2度出ることはありません。入れたままならそれぞれが独立な引きで、これはサイコロ、抽選機、繰り返しのあるシャッフル再生に正直なモデルです。パネルはさらに、範囲にいくつの異なる値があるか、そして重複を許したときに値が衝突する確率がどれくらいかを報告します。
公式
next = (state + 0x6D2B79F5) を乗算シフトで混ぜる → value = minimum + ⌊next × (maximum − minimum + 1)⌋
- seed
- 生成器の開始状態で、0から4,294,967,295までの任意の整数です。それ自体は乱数源ではありません。並びが始まる地点のことで、だから同じシードがいつも同じ一覧を返すのです
- state
- 動いている途中の状態で、数を1つ作るごとに1回更新されます。更新は状態を固定の定数と混ぜ、いくつかの乗算シフトを施します。混ぜることで連続する値が無関係に見えるようになり、簡略化すると真っ先に壊れるのがこの段階です
- minimum, maximum
- 範囲の両端で、どちらも含まれます。小数が掛けられるのは範囲の幅なので、範囲内のどの整数も同じ確率になります
- ⌊ ⌋
- 切り捨てです。生成器は [0, 1) の小数を作り、床関数がそれを範囲内の整数の1つに変えます
- count
- 作る数の個数で、200までです。重複を切っているときは範囲の幅を超えられません。選び出したものは、そのもとになる母集団より長くはできないからです
1つの数ではなく一覧が必要なときに使います。手で確かめるための標本、どの回でも同じでなければならないテストケースの集まり、聴衆の前で再実行したい抽選、仮のデータなどです。シードを固定できることが、言語に付属する乱数関数よりもこれを選ぶ理由になります。シードは1回きりの結果を、共有でき、再確認でき、議論できるものに変えます。同じ項目が2度現れてはならないときは重複を切って使ってください。宝くじの抽選、一覧からの無作為抽出、並べ替えた順序がその形です。向かないのは2つです。予測できない数の源ではないので、当てられては困るものはここに置けません。そして実在する母集団の統計的な無作為標本の代わりにはなりません。母集団について何も知らず、知っているのは範囲だけだからです。
計算例
1から100までの5つの数と、もう一度同じ5つ
- 1から100の範囲には100通りの値があるので、各回の引きは100のうちの1つ
- シード1が開始状態を決め、5つの数がそれぞれ1度ずつそれを更新する
- 各小数を1から100に切り下げると、その順に63、1、53、99、97になる
この5つの数は偶然でも保存された表でもありません。シード1が出すもので、シードの欄にもう一度1と打てばそのまま再現されます。9.65%は範囲と個数についての記述で、この特定の引きについてのものではないことにも注意してください。100通りの値から5つ引くとき、そのうちの2つが一致する確率は10分の1を少し下回りますが、この一覧のどれか2つが実際に一致するかどうかとは関係ありません。シードを7に変えると、その割合はそのままにまったく別の一覧が出ます。パネルのどこが乱数でどこが算術かを見る最も明快な方法です。
1から49までの6つの数、重複は禁止
- 母集団は49通りで、6つを非復元で引く
- 新しい数は、まだ出していない値になるまで引き直され、だから同じ値が2度現れることはありません
- 作られた順に一覧を読むと23、16、33、31、8、11
重複を切っても27.26%は変わらず、それがこの例の隣にこの数を出している理由です。49から6つ引くとき、重複を許していたらぶつかっていた確率のことで、禁止したかどうかには関係ありません。大きな個数で重複なしの引きが高くつく理由でもあります。49通りから6つでは、制限のない引きの4分の1以上が何かを繰り返し、365から23つになるとその割合は半分を超えます。数は並べ替えられず引かれた順のままで、だから同じシードと同じ設定がいつも同じ一覧を再現します。
値が1つしかない範囲
- 範囲には値が1つしかないので、どの引きもその値になる
- 重複の確率は4つの引きがぶつかる確率で、母集団が1つなら必ずぶつかる
- 結果は7、7、7、7
ここが乱数生成が乱数であることをやめて定数になる境目で、何かを押す前に出力が完全に予測できる唯一の場合なので覚えておく価値があります。重複なしの設定の境界でもあります。同じ範囲で2つを重複なしで求めると、短い一覧ではなく実行できない要求になり、このページは黙って1つ返す代わりにそう告げます。
適用限界
ここに出る数は、当てられては困るものには向きません。生成器は普通のソフトウェアに組み込まれている種類の、小さく速いシード付きの算術的な並びです。シードが分かれば誰でも一覧全体を再現でき、そこからいくつかの値が分かれば残りも割り出せます。だからパスワード、鍵、トークン、ワンタイムコード、お金のかかる抽選、そのほか参加者に結果を予測されたり再構成されたりしてはいけないものには使えません。それらには暗号学的な乱数源だけが正しい答えです。重複の確率も、目の前の一覧についての主張ではありません。その大きさの引きをその母集団から行ったときに少なくとも1組が衝突する確率で、引きが独立で一様だと仮定して計算され、重複を許したかどうかに関わらず報告されます。その実際の意味が人を驚かせます。衝突は母集団の大きさのおよそ平方根で起こりやすくなるので、365日から23人を引くとすでに五分五分を超えます。これは誕生日問題と同じ算術です。そして個数は1回あたり200までで、個数が母集団を超えると重複なしは実行できません。
よくある質問
- これらの数は抽選やパスワードやセキュリティトークンに使っても安全ですか
- いいえ。この生成器は普通のソフトウェアが使う種類の小さなシード付きの算術的な並びで、暗号学的なものではありません。シードからは一覧全体が再現でき、いくつかの値からは残りが割り出せます。参加者に結果を予測されたり再構成されたりしてはいけないもの、つまりお金のかかる抽選、パスワード、鍵、トークン、ワンタイムコードには、代わりに暗号学的な乱数源が必要です。抽選、標本、ゲーム、テストデータのように、再現できることが漏えいではなく利点になる場面では、これが正しい道具です。
- シードは何のためで、なぜ毎回同じ数が出るのですか
- シードは並びが始まる状態なので、同じシードはいつも同じ一覧を生みます。これは意図したことで、結果を再現できるようにします。標本を誰かに渡すとき、聴衆の前で抽選をやり直すとき、テストケースをずらさずに保ちたいときに欲しくなる性質です。シードを変えれば同じ設定から別の一覧が出ます。毎回違う数が欲しいときは実行のたびにシードを変えてください。打ち込んだ値は結果と一緒に記録されるので、気に入った一覧はいつでも取り戻せます。
- 重複を許していると、どうして重複が現れることがあるのですか
- それぞれの引きが独立だからです。重複を許すと、どの位置もほかの位置が何を選んだかを気にせずに範囲の値の1つを選びます。これはサイコロや、球を戻す抽選機に正直なモデルです。パネルの重複の確率は、少なくとも1組が衝突する確率ちょうどで、100通りの値から5つ引くときはおよそ9.65%、365から23つ引くと50%を超えます。これは誕生日問題として知られている算術です。同じ値が2度現れてはならないときは重複を切ってください。福引き、一覧からの標本、並べ替えた順序がその形です。
- 重複を禁止すると重複の確率は小さくなりますか
- いいえ、パネルが同じ数を出し続けるのは意図したことです。この数は、その切り替えを入れるときに実際に尋ねている問いに答えています。重複が許されていたら衝突がどれくらい起こりやすかったか、です。1から49までの6つなら27.26%なので、重複を禁止することは理論上の危険ではなく実際の危険を取り除いています。重複なしの引きが大きな個数で遅くなり、やがて不可能になる理由も説明します。個数が範囲の値の数を超えると有効な答えがまったくなくなり、このページは短い一覧を返す代わりにそう報告します。
- 一度に何個まで、どんな範囲で生成できますか
- 1回あたり200個までで、範囲の両端は整数で、最小値は最大値より大きくてはいけません。値そのものは負でもよく、−50から50までの範囲は問題ありません。整数でない端点は丸めずに拒否します。重複を禁止しているとき、小数を含む範囲から引くと重複なしの規則が空の条件になってしまい、自分の設定を黙って無視しながらもっともらしく見える一覧は、エラーメッセージより悪いからです。
- 数は並べ替えられますか
- いいえ、引かれた順に印字され、その順序は結果の一部です。並べ替えると、同じシードが再現することになっている情報を捨てることになり、並べ替えた順序を割り当てたり手札を配ったりするように位置に意味がある場合に困ります。順序のある選択が欲しいときは、コピーしたあとで自分で一覧を並べ替えてください。抽選そのものはシードが生んだ並びのままです。
参考文献
- SP 800-90A Rev. 1, Recommendation for Random Number Generation Using Deterministic Random Bit Generators — 決定的な乱数ビット生成器についての勧告。このページの生成器が満たしていない要件が書かれています — National Institute of Standards and Technology (NIST), Computer Security Resource Center
- Math.random() — JavaScriptリファレンス:シードの引数を持たない組み込みの生成器と、暗号学的に安全ではないという明示的な警告 — MDN Web Docs (Mozilla)
- Birthday Problem — 母集団から引いた集合の中に同じ値が現れる確率。母集団の大きさについての下降階乗の積を1から引いたものです — Wolfram MathWorld (United States)