piapia123
ja

乱数ジェネレーター

生成

処理はすべてブラウザ内で完結します。データは送信されません

出力

乱数を出すだけの単純な話に見えますが、正しく出るかどうかは見落としやすい数点で決まります。 乱数源は `crypto.getRandomValues` で、`Math.random` ではありません。 後者はエンジンによっては予測可能な擬似乱数列で、抽選やクーポン配布、ランダムなグループ分けに使うと実際の脆弱性になります。 範囲は両端を含みます。 1 から 10 と指定すれば 1 も 10 も出ます。実装には剰余ではなく棄却サンプリングを使っています。剰余だと小さいほうの値がわずかに出やすくなります(0–255 を 1–10 に対応させると、最初の 6 つは元が 6 通り、残りは 5 通りになる)。小さな標本では見えませんが、実際に偏りです。 重複の排除は約束です。 範囲に足りないのに重複なしを指定したらエラーにします。黙って個数を減らしたり、こっそり重複を混ぜたりはしません。 基数は別ツールではなく 1 列です。 「2 進数の乱数を 10 個」と「乱数を 10 個出してから 2 進数にする」は同じ作業なので、ここで一度に済ませます。

機能

  • 整数と小数の 2 種類。範囲の両端も出ます
  • 乱数源は `crypto.getRandomValues` で、予測可能な擬似乱数列ではありません
  • 棄却サンプリングで一様性を確保。小さい値が出やすくなる偏りがありません
  • 重複排除は任意。範囲が足りなければエラーにし、黙って重複させたり減らしたりしません
  • 昇順・降順に並べ替え可能。並べ替えるのは同じ一批で、生成し直しません
  • 出力は 10 進・2 進(0b)・8 進(0o)・16 進(0x)
  • 一度に最大 1000 個。整数の範囲は ±2⁵³ まで
  • 小数桁は 0〜12 桁
  • すべて端末内で生成し、外部への通信はありません

使い方

  1. 整数か小数を選びます
  2. 最小値・最大値・個数を入力します
  3. 必要なら重複排除や並べ替えを設定します
  4. 「再生成」で引き直し、「コピー」で取り出します

よくある質問

Math.random を使わないのはなぜですか?
`Math.random` はエンジンによっては予測可能な擬似乱数列で、十分な出力を観察すると次の値が計算できてしまうためです。抽選、クーポンコード、ランダムなグループ分けに使うと、数列を見られる相手に結果を委ねることになります。このツールは OS が提供する暗号学的乱数 `crypto.getRandomValues` を使い、内部状態を外に出しません。
「重複なし」で個数を減らすのではなくエラーにするのはなぜですか?
それが約束だからです。重複なしで 10 個と言われて 7 個返したら、ツールが壊れているか数え間違えたと思うでしょう。10 個返したが中に重複があれば、重複排除が効いていないと思うでしょう。どちらもエラーより悪い結果です。エラーなら「その範囲では用意できない」と伝わり、範囲に何個あるかも示します。
分布に偏りはありませんか?
2 つの面で対処しています。乱数源は暗号学的です(上記参照)。値の取り出し方は棄却サンプリングで、範囲で割り切れる最大の区間を求め、そこから外れた値は捨てて引き直します。よくある `乱数バイト % 範囲` の書き方だと小さい値がわずかに出やすくなります(0–255 を 1–10 に対応させると、最初の 6 つが 6 通り、残りが 5 通り)。差は小さいですが実在し、抽選ではまさにそれが問題になります。

関連ツール