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

use*_*465 2 python math numpy python-2.7

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

x**2 + y**2 < 12.25 and x**2 + y**2 > 4
Run Code Online (Sandbox Code Playgroud)

我写了以下函数:

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()  
Run Code Online (Sandbox Code Playgroud)

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

MBo*_*MBo 8

为了在环中获得随机点的均匀分布,应该考虑薄圆形区域的相对区域.它如何适用于圆圈 在此输入图像描述

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

 Fi  = RandomUniform(0, 2 * Pi)
 SquaredR  = RandomUniform(inner*inner, outer*outer)
 R = Sqrt(SquaredR)
 x,y = R * Cos(Fi), R * Sin(Fi)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 6

取一个随机角度和两个约束之间的随机距离; 你需要在一个圆圈中产生一个均匀的分布:

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)
Run Code Online (Sandbox Code Playgroud)


Blc*_*ght 5

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

x[i] = meteorites()[0]
y[i] = meteorites()[1]
Run Code Online (Sandbox Code Playgroud)

这些x值从环上的一个点分配值,并将环上不同点x[i]y值分配给.你从不同的点获得坐标,因为你打了两次电话.y[i]meteorites()

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

x[i], y[i] = meteorites()
Run Code Online (Sandbox Code Playgroud)