地図/基礎/Canvas と数学

円の中にまんべんなく散らす

乱数で円の中に点を撒く。角度を一様、半径を一様に選ぶと、中心がやけに混む。半径 r の細い輪っかの面積は r に比例して増えるのに、半径を一様に選ぶと内側の細い輪も外側の太い輪も同じ確率で当たる。内側に点が余る。

半径 r の円周の長さは 2πr、その輪の面積は半径に比例して増える。半径を一様に選ぶと、面積の広い外側の輪も狭い内側の輪も同じ重みになり、面積あたりの密度が中心ほど高くなる。一様な密度が欲しければ、半径の累積分布が面積に比例するよう r = R·√uu0..1 の一様乱数)を引く。一様乱数を目的の分布へ写すこの操作が逆関数法(inverse transform sampling)。

半径に を一枚かませると面積に比例した選び方になる。r = R · √u。下は左が なし、右が あり。

Run を続けると、左の円は中心に黒い芯ができ、右はのっぺり均一に埋まる。Math.sqrt 一枚の有無で密度の偏りが消える。u をそのまま使うか、√u を通すか、半径の引き方だけが違う。正規分布なら √(−2 ln u) · cos(2πv)(Box–Muller)という別の式になるが、一様乱数を目的の分布へ写す骨は同じ。