Python 生成距离中心大于50个单位但小于250个单位的随机坐标

Python 生成距离中心大于50个单位但小于250个单位的随机坐标,python,python-3.x,Python,Python 3.x,我试图找出如何指定距离中心大于50个单位但距离中心小于250个单位的范围。现在我就这样 obstacles.append((random.randint(-250, 250), random.randint(-250, 250))) 但这指定了距离中心小于50个单位的范围,我不知道如何排除特定范围。因为它在一个圆圈内,我需要正负两个值。 < P>你可以考虑从0到2π弧度(360度)和随机半径从50到250生成一个随机角,然后转换成笛卡尔坐标。 随机导入 从数学输入π,sin,cos def g

我试图找出如何指定距离中心大于50个单位但距离中心小于250个单位的范围。现在我就这样

obstacles.append((random.randint(-250, 250), random.randint(-250, 250)))

但这指定了距离中心小于50个单位的范围,我不知道如何排除特定范围。因为它在一个圆圈内,我需要正负两个值。

< P>你可以考虑从0到2π弧度(360度)和随机半径从50到250生成一个随机角,然后转换成笛卡尔坐标。
随机导入
从数学输入π,sin,cos
def gen_坐标(r_最小值=50,r_最大值=250):
r=random.randint(r_最小值,r_最大值)
θ=2*pi*random.random()
x=r*cos(θ)
y=r*sin(θ)
返回轮(x),返回轮(y)
障碍。附加(gen_coords())

这里有另一种方法,与
random.randint
保持一致,向我们的朋友毕达哥拉斯致敬:

import random
import math

limit = random.randint(50, 250)
x = random.randint(-250,250)
y_limit = int(math.sqrt(abs(limit * limit - x * x)))
y = random.randint(-1 * y_limit, y_limit)

obstacles.append((x, y))

print('x: {0}, y: {1}, len: {2}'.format(x, y, int(math.sqrt(x * x + y * y))))

如果你不介意在约束中间有更大权重的频率,James的答案是很好的。如果希望在所有可能的点上都具有一致的随机性,您可能会发现以下代码非常有用:

import math
import random


def random_int(min_from_center, max_from_center):
    return _constrained_random(min_from_center, max_from_center, random.randint)


def random_float(min_from_center, max_from_center):
    return _constrained_random(min_from_center, max_from_center, random.uniform)


def _constrained_random(min_from_center, max_from_center, method):
    while True:
        x = method(-max_from_center, +max_from_center)
        y = method(-max_from_center, +max_from_center)
        if min_from_center <= math.hypot(x, y) <= max_from_center:
            return x, y
导入数学
随机输入
def random_int(距离_中心的最小值,距离_中心的最大值):
返回\u约束\u随机(来自\u中心的最小值,来自\u中心的最大值,random.randint)
def随机_浮动(最小_自_中心,最大_自_中心):
返回\u约束\u随机(来自\u中心的最小\u,来自\u中心的最大\u,random.uniform)
定义受约束的随机(最小值来自中心,最大值来自中心,方法):
尽管如此:
x=方法(-max_自_中心,+max_自_中心)
y=方法(-max_自_中心,+max_自_中心)

如果min_来自_中心
random.randint(50250)*random.choice((1,-1))
也许?我相信这是有效的,谢谢!舍入可能会在这个过程中引入一些重大错误。只需按原样返回
x
y
,让使用者决定是否需要整数值。考虑<代码> RyMax=1 < /代码>的情况;任何值都将被四舍五入到0。这是我最初使用的方法,但因为他说的是“单位”,而不是绝对距离,我想他想要像素化的数字