【问题标题】:generate 50 points with minimum distance between them is 0.1生成 50 个点,它们之间的最小距离为 0.1
【发布时间】:2021-01-26 21:22:12
【问题描述】:

我想在一个单位正方形中生成 50 个随机坐标,使每个点与其他点的最小欧几里得距离为 0.1。我怎样才能在python中生成这样的?实际上我需要知道如何将条件放入随机数中。但我找不到任何办法。我使用带有该条件的 if 命令的一种方法。但我需要生成 50 个这样的点。感谢您的帮助。

【问题讨论】:

  • 这里的随机是什么意思?你能从 11x11 点网格 (0,0),(0,0.1),(0,0.2) 等中选择 50 个随机点吗?
  • @pygri 我有 0.1 的约束
  • 请检查这些链接 link1link2 可能会有所帮助

标签: python


【解决方案1】:

一个廉价的解决方案是在正方形中不断生成随机点。如果生成的点与其他点不太接近,则保留,否则丢弃。一旦达到 50 点,就可以停止生成随机点。

【讨论】:

  • 这里有趣的一点是,这能保证收敛到一个解决方案吗?我想50分应该是合理的,但它可能不适用于例如100 分和一个糟糕的起点......
【解决方案2】:

这是 Hanna Gabor 描述的生成和测试解决方案的实现:

import random
import math

npoints = 50
mindist = 0.1

def genpt():
    return (random.random(), random.random())

def distance(p1,p2):
    return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)

sample = []

while len(sample) < npoints:
   newp = genpt()
   for p in sample:
      if distance(newp,p) < mindist: break
   else:
     sample.append(newp)

print(sample)

这适用于 50 分。限制似乎是 80 点左右。

正如@pygri 在评论中指出的那样,人们还可以从 121 个点中选择 50 个随机点,这些点沿 x 和 y 轴从 0 到 1 以 0.1 的间隔间隔,因为保证其中任何两个点之间的距离为不小于 0.1。以下代码将执行此操作:

import random

npoints = 50

allpoints = [(a/10,b/10) for a in range(11) for b in range(11)]
sample = random.sample(allpoints, npoints)

print(sample)

【讨论】:

    【解决方案3】:

    您可以从常规网格 (0.1*i, 0.1*j) 中为 i=0..10j=0..10 选择 50 个点

    【讨论】:

    • 一个简洁的解决方案。
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 2015-09-03
    • 2021-10-24
    • 2015-12-24
    • 2017-08-30
    • 2013-11-02
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多