乱数の資料: 生成器の仕組みと弱点

乱数はコンピュータが生成できる最も単純なもののように見えますが、実は最も目立たない形で不具合が生じやすいもののひとつです。このセクションの記事では、乱数がどこから来るのか、信頼できる生成器とそうでないものの違い、そして教室での抽選やプレゼント企画、テストデータ作成など、結果の正確さが求められる場面でどのツールを使うべきかを解説します。

まずはここから

まずは乱数生成器とは何ですか?をご覧ください。ハードウェア乱数、擬似乱数、暗号論的擬似乱数生成器の違いや、数値が重複する理由、ブラウザが提供する機能について解説しています。解説ではなくすぐに数値が必要な場合は、乱数生成器をご利用ください。重複の有無を問わず、任意の範囲の数値をブラウザ上で直接生成できます。

生成器が密かに陥る落とし穴

強力な乱数源を用意することは、全体の仕事の半分にすぎません。もう半分は、得られた生の値を目的の範囲へ変換(マッピング)することであり、多くの自作生成器が失敗するのはまさにこの点です。範囲の大きさで割った余り(剰余)を取るのは直感的な手法ですが、これにはわずかな偏りが生じます。乱数源の出力空間が指定範囲の大きさで割り切れない限り、範囲内の小さい数値が他の数値よりもわずかに高い確率で出現してしまうのです。この欠陥は剰余による偏り(modulo bias)と呼ばれます。解決策のひとつが棄却サンプリング(rejection sampling)です。端数となる不均一な範囲に落ちた値を破棄して再度生成し直す方法です。当サイトの生成器はこの処理を行っているため、すべての数値が毎回の抽選で完全に等しい確率で選ばれます。

同じ理由から、安易に選ばれがちなショートカットも除外されます。Math.random() はセキュリティを一切保証しておらず、表計算ソフトの RAND() や RANDBETWEEN() などの関数も同類です。大まかな並べ替え程度なら十分ですが、公平性を問われるような用途には適していません。

数値、リスト、サイコロ

乱数生成器は、設定した範囲の数値を返します。ランダムピッカーは、名前や項目、選択肢など貼り付けたリストを対象とするため、手作業で数値を各行に対応付ける手間がかかりません。ボードゲームなどの卓上ゲームには、サイコロを振って合計を計算するサイコロ生成器があり、二者択一の決定ならコイントスで十分です。何かの決定ではなく保護のために乱数が必要な場合は、強力なパスワード生成をご利用ください。すべてのツールが、ブラウザ内の同一の暗号論的に安全な乱数源を利用しています。

ツールを使ってみますか?

ブラウザ上で直接動作する、無料かつ安全な乱数生成器をお試しください。

ツールを開く