我有一些点位于同一个地方,使用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
和y
是随机值。但我完全不知道如何生成这个!
(我知道我应该用something like this来解释地球表面的曲率,但实际上一个简单的圆圈可能很好:))
答案 0 :(得分:1)
基本思想是,生成一个x =半径为y = 0的向量。 然后,将矢量旋转0到360之间的随机角度,或0到2 pi弧度。
然后应用此位移矢量,您将随机抖动放在一个圆圈中。
我的一个脚本中的示例:
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指出的那样,添加
radius *= math.sqrt(random())
统一分配
答案 1 :(得分:1)
在圆圈内生成随机样本的一种简单方法是直接生成方形样本,然后拒绝那些落在圆圈外的样本。
答案 2 :(得分:0)
仅仅剔除落在你圈子之外的结果就足够了。
如果您不想丢弃一定比例的随机结果,您可以选择随机角度和距离,以确保所有值都落在圆的半径范围内。重要的是要注意,使用此解决方案,用于将角度外推到矢量中的方法的精度将使您的分布偏向更集中在中心。
如果你用你的x,y值制作一个向量,然后做一些事情,比如随机化所述向量的长度落在你的圈内,你的分布将不再是统一的,所以我会避开这种方法,如果一致性是你最关心的问题。
在我提到的三种方法中,剔除方法是最均匀分布的,尽管随机角度/长度方法通常很好,除非涉及非常精确的精度和粒度。