我无法弄清楚如何很好地标记这个问题。
我需要生成一些随机3D点,其中元素值在原点附近的范围内,但是没有点在原点周围的某个半径范围内。
视觉上,这应该是原点周围的空球。我通过以下方式做到了这一点:
for Food in xrange(100):
food_array[Food] = 20*np.random.uniform(-1,1,3)
if mag(food_array[Food]) < 4:
del food_array[Food]
mag()计算距原点的距离,如果小于4,则删除该元素。这样做很好,但我的问题是,什么是干净的方式然后继续循环,直到food_array有100种食物?
我需要总是以相同数量的点结束,但显然如果我删除其中的一些,我需要它继续前进,直到数组有100个点。我可以想到至少有四种不同的方法来做到这一点,但我讨厌所有这些。
请给我一个优雅的解决方案。
答案 0 :(得分:2)
food_array = []
while len(food_array) < 100:
item = 20*np.random.uniform(-1,1,3)
if mag(item) >= 4:
food_array.append(item)
答案 1 :(得分:2)
一种方法是避免添加一个点,直到你得到一个好点。
for Food in xrange(100):
while True:
point = 20*np.random.uniform(-1,1,3)
if mag(point) >= 4:
break
food_array[Food] = point
我可能会提取一个方法来使逻辑更清晰,并允许你使用列表理解。
def generate_point(min_radius):
while True:
point = 20*np.random.uniform(-1,1,3)
if mag(point) >= min_radius:
return point
food_array = [generate_point(min_radius=4) for i in xrange(100)]