如何在循环分布中生成随机点

时间:2015-06-01 00:10:15

标签: python distribution point

我想知道如何生成出现在循环分布中的随机数。

我能够在矩形分布中生成随机点,使得点在(0 <= x <1000,0 <= y&lt; 1000)的平方内生成:

我将如何继续在圆圈内生成点,以便:

(x-500)^ 2 +(y-500)^ 2&lt; 250000?

7 个答案:

答案 0 :(得分:8)

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中,circle_y为500。 circle_r是500。

根据this answer

计算半径的另一个版本,以获得均匀分布的点
u = random.random() + random.random()
r = circle_r * (2 - u if u > 1 else u)

答案 1 :(得分:7)

第一个答案: 一个简单的解决方案是在继续之前检查结果是否满足您的等式。

生成x,y(有多种方法可以随机化为选择范围)

检查((x-500)^ 2 +(y-500)^ 2&lt; 250000)是否为真 如果没有,重新生成。

唯一的缺点是效率低下。

第二回答:

或者,你可以做一些类似于黎曼和类似于近似积分的东西。通过将圆圈分成许多矩形来近似圆圈。 (矩形越多,越准确),并对圆内的每个矩形使用矩形算法。

答案 2 :(得分:4)

您需要的是从(极地形式)采样:

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)

Related(虽然不是Python),但提出了这个想法。

答案 3 :(得分:1)

您可以使用下面的代码,如果想了解更多信息 https://programming.guide/random-point-within-circle.html

    <h:form>
        <p:growl id="messages" showDetail="true" />
        ....
    </h:form>

答案 4 :(得分:0)

我会使用极坐标:

r_squared, theta = [random.randint(0,250000), 2*math.pi*random.random()]

然后r总是小于或等于半径,而theta总是在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

答案 5 :(得分:0)

你可以使用rejection sampling,在覆盖圆圈的(2r)×(2r)方格内生成一个随机点,重复直到在圆圈内得到一个点。

答案 6 :(得分:0)

这是一个例子,希望可以帮助某人:)

randProba = lambda a: a/sum(a)
npoints = 5000 # points to chose from
r = 1 # radius of the circle

plt.figure(figsize=(5,5))
t = np.linspace(0, 2*np.pi, npoints, endpoint=False)
x = r * np.cos(t)
y = r * np.sin(t)
plt.scatter(x, y, c='0.8')

n = 2 # number of points to chose
t = np.linspace(0, 2*np.pi, npoints, endpoint=False)[np.random.choice(range(npoints), n, replace=False, p=randProba(np.random.random(npoints)))]
x = r * np.cos(t)
y = r * np.sin(t)

plt.scatter(x, y)

enter image description here