试图在python中的环中生成随机x,y坐标

时间:2017-01-28 16:35:56

标签: python python-2.7 numpy math

我试图在一个环中生成随机的x和y坐标,其外半径为3.5,内半径为2.因此x和y必须满足以下条件:

x**2 + y**2 < 12.25 and x**2 + y**2 > 4

我写了以下函数:

def meteorites():
    circle = False
    while circle == False:        
        r = np.array([uniform(-6., 6.), uniform(-6., 6.)])
        # we will regenerate random numbers untill the coordinates
        # are within the ring x^2+y^2 < 3,5^2 and x^2+y^2 > 2^2
        if (r[0]**2+r[1]**2 < 12.25) and (r[0]**2+r[1]**2 > 4.):
            circle = True

       else :
            circle = False

    return r[0], r[1]

x = np.zeros(1000)
y = np.zeros(1000)
for i in range(1000):
    x[i] = meteorites()[0]
    y[i] = meteorites()[1]
plt.scatter(x,y)
plt.show()  

当我绘制结果坐标时,我得到一个从-3.5到3.5的正方形。我似乎无法找到问题所在。我也不确定它是编码错误还是一些数学问题。既然你们两个都很擅长,你能看到我在这里做错了吗?

7 个答案:

答案 0 :(得分:8)

为了在环中获得随机点的均匀分布,应考虑薄圆形区域的相对区域。 How it works for the circle enter image description here

对于您的情况,在内半径和外半径的平方范围内生成均匀分布的SquaredR。伪代码:

 Fi  = RandomUniform(0, 2 * Pi)
 SquaredR  = RandomUniform(inner*inner, outer*outer)
 R = Sqrt(SquaredR)
 x,y = R * Cos(Fi), R * Sin(Fi)

答案 1 :(得分:6)

采用随机角度和两个约束之间的随机距离;你需要制作一个uniform distribution in a circle

from math import sin, cos, radians, pi, sqrt

def meteorites():
    angle = uniform(0, 2 * pi)  # in radians
    distance = sqrt(uniform(4, 12.25))
    return distance * cos(angle), distance * sin(angle)

答案 2 :(得分:5)

你得到的随机分数不会落在你的戒指上,因为这两行不符合你的要求:

x[i] = meteorites()[0]
y[i] = meteorites()[1]

这些值会将铃声中一个点的x值分配给x[i],将y从铃声中的其他点分配给{{ 1}}。您可以从不同的点获取坐标,因为您正在调用y[i]两次。

相反,您可能想要调用该函数一次,然后分配给每个坐标,或者使用iterable-unpacking进行赋值,其中两个目标都位于等号的左侧:

meteorites()

答案 3 :(得分:2)

正如@Martijn Pieters建议的那样,只需在你需要的范围内均匀地绘制极坐标。

theta = uniform(0,2*np.pi)
r = uniform(2.,3.5)
x = r*np.cos(theta)
y = r*np.sin(theta)

编辑:纯数学上环中的每个点都有相同的概率。

但实际上,给定theta的近似r更接近下限的像素数将会减少。因此,r较小的“陨石”概率会更大。

我相信这种影响是疏忽的。

答案 4 :(得分:2)

我还想通过一个循环来选择一个随机角度和一个随机距离。然后从中计算出坐标。

但在您的代码中,第一个问题是应该写:

x[i],y[i] = meteorites()

而不是

x[i] = meteorites()[0] 
y[i] = meteorites()[1]

在你的例子中,你被称为陨石()两次,导致x和y两种不同的陨石。

答案 5 :(得分:2)

如果您更正了一行,您的实施也会有效:只需拨打meteorites()两次,只需拨打一次。

x = np.zeros(1000)
y = np.zeros(1000)
for i in range(1000):
    x[i], y[i] = meteorites()
plt.scatter(x,y)
plt.show()  

enter image description here

答案 6 :(得分:0)

您可以尝试以下操作使用numpy生成1000个样本:

import numpy 
n = 1000
phi = numpy.random.uniform(0, 2*numpy.pi, n)
r = numpy.random.uniform(2, 3.5, n)

然后,使用从径向到笛卡尔坐标的变换,可以如下构造x,y坐标:

x = r * numpy.cos(phi)
y = r * numpy.sin(phi)

这显示了numpy的强大功能,因为x和y现在是数组而不需要迭代n。