循環分布で現れる乱数をどのように生成できるのか疑問に思っています。
(0 <= x <1000、0 <= y <1000)の2乗内に点が生成されるように、一様分布でランダムな点を生成できます。
次のような円内の点を生成するにはどうすればよいですか?
(x−500)^ 2 +(y−500)^ 2 <250000?
import random
import math
# radius of the circle
circle_r = 10
# center of the circle (x, y)
circle_x = 5
circle_y = 7
# random angle
alpha = 2 * math.pi * random.random()
# random radius
r = circle_r * math.sqrt(random.random())
# calculating coordinates
x = r * math.cos(alpha) + circle_x
y = r * math.sin(alpha) + circle_y
print("Random point", (x, y))
あなたの例では、circle_x
は500であり、circle_y
は500です。 circle_r
は500です。
この回答 に基づいて、均一に分布した点を取得するための半径の計算の別のバージョン
u = random.random() + random.random()
r = circle_r * (2 - u if u > 1 else u)
最初の答え:簡単な解決策は、先に進む前に、結果が方程式を満たしているかどうかを確認することです。
X、yを生成します(選択範囲にランダム化する方法があります)
((x−500)^ 2 +(y−500)^ 2 <250000)が真であるかどうかを確認し、真でない場合は再生成します。
唯一の欠点は非効率です。
2番目の答え:
または、積分を近似する場合のように、リーマン和と同様のことを行うことができます。円を多くの長方形に分割して、円を近似します。 (長方形が多いほど、正確になります)、円内の各長方形に長方形アルゴリズムを使用します。
必要なのは(極形式)からサンプリングすることです:
r, theta = [math.sqrt(random.randint(0,500))*math.sqrt(500), 2*math.pi*random.random()]
次に、r
とtheta
をデカルト座標x
とy
に変換します。
x = 500 + r * math.cos(theta)
y = 500 + r * math.sin(theta)
関連 (Pythonではありませんが)、しかしアイデアを与えます。
以下のコードを使用して、詳細を知りたい場合は https://programming.guide/random-point-within-circle.html
import random
import math
circle_x = 500
circle_y = 500
a = random.randint(0,500) * 2 * math.pi
r = 1 * math.sqrt(random.randint(0,500))
x = r * math.cos(a) + circle_x
y = r * math.sin(a) + circle_y
極座標を使用します:
r_squared, theta = [random.randint(0,250000), 2*math.pi*random.random()]
その場合、rは常に半径以下であり、シータは常に0〜2 * piラジアンです。
Rは原点にないので、正しく理解していれば、常に500、500を中心とするベクトルに変換します。
x = 500 + math.sqrt(r_squared)*math.cos(theta) y = 500 + math.sqrt(r_squared)*math.sin(theta)
this のため、r_squaredをランダムに選択します
棄却サンプリング を使用して、円をカバーする(2r)×(2r)
正方形内にランダムな点を生成し、円内に1つの点が得られるまで繰り返します。