「Julia でビュフォンの針」を書いたのには,速度比較だけではなく,もう一つ別の目的があったからなのだ。
ビュフォンの針のシミュレーションで,原点からのベクトルを考えるときに,方向がランダムなベクトルを作るときに,「長さが1以上のベクトルは除く」という操作をした後のベクトルだけを使わないと方向がランダムなベクトルは作れないということだった。
3次元空間でも同じで,球面に一様分布する点を表す座標を求めるときにも同じなのだ。-1 <= x, y, z <= 1 の一様乱数 x, y, z を発生させ,原点を起点,x, y, z を終点とするベクトルの内,ノルムが 1 より大きいは捨てる。ノルムが 1 以下のベクトルはノルムが 1 になるように伸ばすそうすれば,ベクトルの終点は球面に一様分布する。
以下のプログラムでできる x, y, z を,3次元空間にプロットできる。
グラフをぐりぐり動かすと点が一様分布している(らしい)ことが確認できる。
using Plots
plotly()
n=10000
xyz = (rand(n, 3) .- 0.5) .* 2
r = vec(sum(xyz.^2, dims=2))
xyz = xyz[r .<= 1, :] #@@@
r = r[r .<= 1] #@@@
factor = sqrt.(r)
xyz = xyz ./ factor
p = scatter(xyz[:, 1], xyz[:, 2], xyz[:, 3], markersize=0.1)
#@@@ を付けた 2 行を省いて,わかりやすくするために点の数を 5 倍にして図を描いてみると以下のようになる。濃淡があるということは,球面上で点が一様分布していないということである。
※コメント投稿者のブログIDはブログ作成者のみに通知されます