<p>这里有一个有点天真的命中或未命中的方法:</p>
<pre><code>from math import sqrt
from random import randint
from itertools import combinations
def dist(p,q):
return sqrt((p[0]-q[0])**2 + (p[1]-q[1])**2)
def rand_points(n,k):
"""picks n random points with coordinates in range(k)"""
#assumes that this is feasible!
choices = set()
for _ in range(n):
while True:
p = (randint(0,k-1),randint(0,k-1))
if p not in choices:
choices.add(p)
break
return list(choices)
def check_points(points,min_dist):
"""checks if each point is at least min_dist away from other points"""
return all(dist(p,q) >= min_dist for p,q in combinations(points,2))
def find_points(grid_size,num_points,min_dist,max_trials = 1000):
for trial in range(max_trials):
points = rand_points(num_points,grid_size)
if check_points(points,min_dist):
return points
</code></pre>
<p>例如:</p>
<pre><code>>>> find_points(30,10,5)
[(26, 9), (6, 0), (29, 23), (17, 13), (12, 19), (2, 22), (2, 28), (3, 9), (1, 16), (18, 5)]
</code></pre>
<p>当然,将这样的点列表加载到网格中很容易:</p>
<pre><code>def grid_from_points(grid_size,points):
grid = [[0]*grid_size for _ in range(grid_size)]
for p,q in points:
grid[p][q] = 1
return grid
points = rand_points(num_points,grid_size)
if check_points(points,min_dist):
return points
</code></pre>