偽乱数は「ランダムに見える」ことを優先した値です。
本物の乱数(青)と同じ数直線に載せ、0〜100の整数で重複しません。
1点目
0〜100のどこかに、ランダムで1点置きます。
2点目以降
-
数直線上の 0・すべての点・100 を並べ、隣り合う点どうしのあいだ(区間)を調べます。
点は本物・偽の両方を含みます。
-
いちばん幅が広い区間を選びます。同じ幅が複数あるときは、その中からランダムに1つ選びます。
-
選んだ区間の中で、次の値を決めます。
- 区間の左端が 0 のとき → 0〜20 のどこか
- 区間の右端が 100 のとき → 80〜100 のどこか
- それ以外 → 区間の中央付近。中央値から ±10 の範囲(区間幅が20未満のときは ±5)のどこか。はみ出す場合は区間内に収めます。
- すでに使われている数と重なった場合は、別の値になるまでやり直します。
例
-
偽乱数だけが 7 のとき → いちばん空いているのは 7〜100 なので、次は 80〜100 付近になりやすいです。
-
偽乱数が 25 と 75 のとき → いちばん空いているのは 25〜75(幅50)なので、次は中央50の ±10、つまり 40〜60 付近になりやすいです。
本物の乱数は crypto.getRandomValues() で生成しています。厳密に言えばこれも真の完全な乱数ではないですが、数学的には十分にランダムです。
今回制作した偽乱数は「空白を埋める」ように寄せるため、点がならんで見え、人間にはランダムらしく感じられます。