楕円内の一様乱数
以前、
から、乱数の生成を作ることができました。
現在、斜め45度くらいに述びた街の位置情報を乱数で作る為に、楕円周内の一様乱数を調べていたのですが、見つけられていません。
累積密度関数が一様になるように計算式を作れば良い、ということは分かったのですが、そんなの面倒くさくてやっていられません。
ふと思ったのですが、円周内の一様乱数ではθとr を使って、乱数を使っていて、この場合、r=sqrt(乱数)を使っているのだから、θの値に応じた新しいr'を作ってそのまま放り込んでやればいいのでは、と思いつきました。
面倒なので、x軸方向の長さは1.0として、y軸方向の長さをbとすれば、
x=cosθ 、 y=b sinθ となるので、r'= sqrt(x^2+y^2) に放り込むだけ、上記の円周内の一様乱数と同じやり方でできるんじゃないの、と考えて、エクセルで試しました。ここではb=0.5にしています。
結論:上手くいきませんでした。
もう面倒くさくなったので、r' に sqrt(0~1)の乱数を使って、x=cosθ 、 y=b sinθ に乗算するだめの「なんちゃって楕円内の一様乱数」 を作って対応しました。
こんな感じです。
// 住民の居住区を計算
shita := 2.0 * 3.141592654 * rand.Float64()
x := 0.03296 * math.Cos(shita)
y := 0.01893 * math.Sin(shita)
r := math.Sqrt(rand.Float64())
rx := r * x
ry := r * y
// 45度回転 + 基本座標
x_map := 1.0/math.Sqrt(2.0)*(rx-ry) + 131.46231887576513
y_map := 1.0/math.Sqrt(2.0)*(rx+ry) + 34.171317284454766
「ここは主戦場でなない」と腹を括って、逃げるのも、エンジニアには必須の技量です。