在二维圆半径内生成随机xy值?

2024-07-08 11:42:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些点位于同一个地方,用WGS84 latlngs,我想随机地“抖动”它们,这样它们就不会重叠了。在

现在我使用的是一种粗糙的方法,它在一个正方形内使它们抖动:

r['latitude'] = float(r['latitude']) + random.uniform(-0.0005, 0.0005)
r['longitude'] = float(r['longitude']) + random.uniform(-0.0005, 0.0005)

我怎样才能使它们在一个圆圈内随机抖动呢?在

我想我想要一个乘积x*y = 0.001,其中x和{}是随机值。但我完全不知道如何生成这个!在

(我意识到我真的应该用something like this来解释地球表面的曲率,但实际上,一个简单的圆可能很好:)


Tags: 方法地方randomuniformfloatsomethinglike乘积
3条回答

仅仅剔除掉你圈子之外的结果就足够了。在

如果不想抛出某些百分比的随机结果,可以选择一个随机角度和距离,以确保所有值都在圆的半径范围内。重要的是要注意,在这个解决方案中,你用来将一个角度外推到一个向量的方法的精度会使你的分布更加集中在中心。在

如果你用你的x,y值做一个向量,然后把这个向量的长度随机地放到你的圆内,你的分布将不再是均匀的,所以我会避开这种方法,如果均匀性是你最关心的。在

剔除方法是我提到的三种方法中分布最均匀的,尽管随机角度/长度方法通常很好,除非涉及非常精细的精度和粒度。在

在一个圆内生成随机样本的一个简单方法就是按原样生成方形样本,然后拒绝掉掉在圆外的样本。在

基本思想是,生成一个x=圆半径y=0的向量。 然后将向量旋转0到360或0到2π弧度之间的随机角度。在

然后应用这个位移向量,你就得到了一个圆形的随机抖动。在

我的一个脚本中的一个例子:

    def get_randrad(pos, radius):
        radius = random() * radius
        angle = random() * 2 * pi
        return (int(pos[0] + radius * cos(angle)),
                int(pos[1] + radius * sin(angle)))

位置是目标位置,半径是“抖动”范围。在

正如pjs指出的,添加

^{pr2}$

均匀分布

相关问题 更多 >

    热门问题