web-dev-qa-db-ja.com

循環分布でランダムな点を生成する方法

循環分布で現れる乱数をどのように生成できるのか疑問に思っています。

(0 <= x <1000、0 <= y <1000)の2乗内に点が生成されるように、一様分布でランダムな点を生成できます。

次のような円内の点を生成するにはどうすればよいですか?

(x−500)^ 2 +(y−500)^ 2 <250000?

12
Jack8246
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)
10
f43d65

最初の答え:簡単な解決策は、先に進む前に、結果が方程式を満たしているかどうかを確認することです。

X、yを生成します(選択範囲にランダム化する方法があります)

((x−500)^ 2 +(y−500)^ 2 <250000)が真であるかどうかを確認し、真でない場合は再生成します。

唯一の欠点は非効率です。

2番目の答え:

または、積分を近似する場合のように、リーマン和と同様のことを行うことができます。円を多くの長方形に分割して、円を近似します。 (長方形が多いほど、正確になります)、円内の各長方形に長方形アルゴリズムを使用します。

8
Fuad

必要なのは(極形式)からサンプリングすることです:

r, theta = [math.sqrt(random.randint(0,500))*math.sqrt(500), 2*math.pi*random.random()]

次に、rthetaをデカルト座標xyに変換します。

x = 500 + r * math.cos(theta) 
y = 500 + r * math.sin(theta)

関連 (Pythonではありませんが)、しかしアイデアを与えます。

4
vsoftco

以下のコードを使用して、詳細を知りたい場合は 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
1
Md Jewele Islam

極座標を使用します:

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をランダムに選択します

0
fiacre

棄却サンプリング を使用して、円をカバーする(2r)×(2r)正方形内にランダムな点を生成し、円内に1つの点が得られるまで繰り返します。

0
dlavila