干净的方式继续循环,直到数组已填充可接受的值?

时间:2015-12-18 18:08:52

标签: python loops

我无法弄清楚如何很好地标记这个问题。

我需要生成一些随机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个点。我可以想到至少有四种不同的方法来做到这一点,但我讨厌所有这些。

请给我一个优雅的解决方案。

2 个答案:

答案 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)]