まず一様乱数を覗く
Math.random() は 0 以上 1 未満を返す。一粒ずつ見ても、平らにばらけているかは分からない。たくさん振って、値がどのあたりに落ちたかを数えてヒストグラムにすると、分布の形が出てくる。
横に並べた箱(ビン)に、出た値を投げ込んで山の高さを伸ばす。フレームごとに少しずつ振り足すと、最初はガタガタだった山が、振るほど平らに均される。どのビンも同じ確率なので、回数を増やすと高さがそろう。
(r * bins) | 0 で 0〜1 の値を 0〜63 のビン番号に丸めて、そのビンの counts を一つ増やす。expected = total / bins は全試行を均等に割った高さで、薄い横線がその位置に引かれる。振るほど棒たちがその線に寄っていく。
棒は線に寄っても、完全には揃わない。山のてっぺんはいつまでもチリチリ震える。bins を 16 に減らすと一ビンあたりの試行が増えて震えが小さくなり、256 に増やすと一ビンが受け取る数が減って凸凹が目立つ。
ビンごとの度数は出た値の個数。試行を増やすと各ビンの度数の比が確率に近づく(大数の法則)。期待値からのずれは試行数 N に対しておよそ √N で増え、相対的な凹凸は √N / N = 1/√N で縮む。振っても凸凹は消えず、目立たなくなるだけ。各サンプルが前のサンプルと無相関に [0, 1) を等確率で取るのが一様分布(白色ノイズ)で、ノイズに色をつける操作はここに相関を入れていく。