2015-12-18 1 views
2

Я не мог понять, как хорошо отметить этот вопрос.Чистый способ продолжить цикл до тех пор, пока массив не будет заполнен принятыми значениями?

Мне нужно создать ряд случайных трехмерных точек с значениями компонентов в диапазоне вокруг начала координат, но так, чтобы точка не находилась в пределах определенного радиуса вокруг начала координат.

Визуально это должно составлять пустую сферу вокруг начала координат. Я делал это в следующем:

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] 

магнум() вычисляет расстояние от начала, и если оно меньше 4, то этот элемент будет удален. Это прекрасно работает, но мой вопрос: какой чистый способ сделать цикл продолжительным, пока у food_array не будет 100 продуктов?

Мне нужно, чтобы это всегда заканчивалось тем же числом точек, но, очевидно, если я удаляю некоторые из них, мне нужно, чтобы он продолжал идти, пока массив не имеет 100 очков. Я могу придумать по крайней мере четыре разных способа сделать это, но я ненавижу их всех.

Пожалуйста, дайте мне изящное решение.

+0

Что случилось с петлей while? –

ответ

2
food_array = [] 
while len(food_array) < 100: 
    item = 20*np.random.uniform(-1,1,3) 
    if mag(item) >= 4: 
     food_array.append(item) 
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)] 
Смежные вопросы