tooliv

乱数生成器

範囲・個数指定でランダム数値を生成

並び替え

乱数生成器

Math.random()はどの程度ランダムですか?

疑似乱数で統計的には良好な分布を持ちます。ただし、シードが判明すれば予測可能です。セキュリティ用途にはcrypto.getRandomValues()を使用してください。

サイコロの乱数式は?

Math.floor(Math.random() * 6) + 1で1-6の整数を均等に生成します。コインの場合はMath.round(Math.random())で0か1を得られます。

ロト番号はどう生成しますか?

[1..45]の配列でFisher-Yatesシャッフルを使い、最初の6要素を選びます。これで重複のない完全にランダムな組み合わせを得られます。

乱数とは?真の乱数と疑似乱数の違い

コンピュータの乱数のほとんどは「疑似乱数」で、Math.random()はシード(種)を基にした決定論的アルゴリズムが生成します。真の乱数は放射線崩壊や熱ノイズなど物理現象から得られます。ゲームやシミュレーションには疑似乱数で十分ですが、暗号用途では区別が非常に重要です。

なぜMath.random()はパスワードに使えないのか?

攻撃者がMath.random()のシードを特定できると、生成した全ての「乱数」(トークン、セッションID、パスワードリセットリンクなど)を再現できます。Web Crypto APIのcrypto.getRandomValues()はOSのエントロピープールを使用するため、セキュリティ用途に適しています。予測不能な値が必要な場面では常にcrypto APIを使用してください。

Fisher-Yatesシャッフル:重複なし完全乱択

Fisher-Yatesシャッフルは配列を後ろから処理し、現在位置とランダム位置の要素を交換します。O(n)の時間複雑度で完全な乱数順列を生成できます。「生成して重複チェック」という素朴な方法は最悪O(n²)になりますが、Fisher-Yatesは常に線形時間で動作します。

一様分布の重要性

優れた乱数生成器は一様分布を生成し、範囲内のすべての値が等しい確率で出現します。整数の範囲生成にはMath.floor(Math.random() * (max - min + 1)) + minを使用してください。シミュレーションで正規分布やポアソン分布が必要な場合は、Box-Muller変換などの追加処理が必要です。

ゲームとギャンブルにおける乱数

カジノのハウスエッジは乱数の不正ではなく数学的設計によります。ルーレットは37スロット(0-36)ですが、0が出たときの掛け金処理で2.7%のハウスエッジが生まれます。オンラインギャンブルでは第三者機関が認定した乱数生成アルゴリズムの使用が義務付けられています。

よくある質問

Math.random()はどの程度ランダムですか?

疑似乱数で統計的には良好な分布を持ちます。ただし、シードが判明すれば予測可能です。セキュリティ用途にはcrypto.getRandomValues()を使用してください。

サイコロの乱数式は?

Math.floor(Math.random() * 6) + 1で1-6の整数を均等に生成します。コインの場合はMath.round(Math.random())で0か1を得られます。

ロト番号はどう生成しますか?

[1..45]の配列でFisher-Yatesシャッフルを使い、最初の6要素を選びます。これで重複のない完全にランダムな組み合わせを得られます。

関連ツール