9

重複の可能性:
年輪内に乱数を作成する

円環内、つまり、 radius の円の内側にあるが、 radiusR1の円の外側にある領域内で均一に取得されたランダムな点を取得したいと思いますR2。ここで、R1 > R2と 両方の円は同じ点を中心としています。棄却サンプリングの使用は避けたいと思います。

可能であれば、円内のランダムな点を計算するために使用されるこのソリューションに似たソリューションを望んでいます。これは非常にエレガントで直感的です。つまり、平方根の使用も避けたいと思います。

4

3 に答える 3

5

それは非常に簡単です。極座標を使用します。つまり、角度値 theta に対して 1 つのランダム値を生成し、原点からの距離に対してもう 1 つの値を生成します。円は両方とも同じ原点にあるため、これは非常に簡単です。

ただし、注意: 一様乱数関数によってシータ値を生成することはできますが、これは問題ありませんが、ポイントが原点の周りに集まるため、距離についてはそれを行うことができません。円の周囲の長さは ^2 であることを考慮する必要があります (平方根である逆数を使用する必要があります)。

一様分布ランダム関数rnd(0..1) を使用すると、次のようになります。

theta = 360 * rnd();
dist = sqrt(rnd()*(R1^2-R2^2)+R2^2);

編集:デカルト座標に変換するには、次のように計算します:

x =  dist * cos(theta);
y =  dist * sin(theta);
于 2012-10-25T09:11:30.157 に答える
2

編集: この解決策は均一ではない可能性があることに注意してください。以下の Mark Dickinson によるコメントを参照してください。

わかりました、私はそれを理解したと思います。このソリューションはこの回答に大いに影響を受けており、r1 = R1/R1 および r2 = R2/R1 であることに注意してください。

擬似コード:

t = 2*pi*random()
u = random()+random()
r = if u>1 then 2-u else u
r = if r<r2 then r2+r*((R1-R2)/R2) else r
[r*cos(t), r*sin(t)]

これが Mathematica です。

f[] := Block[{u, t, r}, u = Random[] + Random[];
r1 = 1; r2 = 0.3;
t = Random[] 2 Pi;
r = If[u > 1, 2 - u, u];
r = If[r < r2, r2 + r*((R1 - R2)/R2), r];
{r Cos[t], r Sin[t]}]

ListPlot[Table[f[], {10000}], AspectRatio -> Automatic]

簡易アルゴリズムの配布

それが行うことは、内側の円の内側にあるすべての数値を円環に再マッピングし、それらを均等に分散させることです。このソリューションの均一性に関して誰かが問題を見つけた場合は、コメントしてください。

ここにある他のソリューションと比較してください:

sqrt アルゴリズムの分布

于 2012-10-25T11:20:17.340 に答える
1

これを行う最も簡単な方法は、拒否サンプリングを使用することです。一辺の長さが 2*R2 の正方形に多数の点を均一に生成し、それらのサンプルを内側の円ではなく外側の円の内側にフィルター処理します。

きれいでも効率的でもありませんが、ほとんどの場合、十分です。

于 2012-10-25T08:57:25.963 に答える