2016-11-08 6 views
0

Я хочу использовать random.uniform для создания между ними, скажем [-2, 2] с float, но не генерировать 0, это то, как я делаю это в цикле,Python random.uniform не генерировать 0

from random import uniform 

flag = True 

while flag: 
    if uniform(-2, 2) is not 0: 
     flag = False 

я интересно там лучший способ сделать это?

веселит

ответ

1

Это еще что-то для Code Review, но очень кратко:

from random import uniform 

while True: 
    if uniform(-2, 2) != 0.0: 
     break 

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

Очень редко требуется переменная flag, чтобы вырваться из (while) цикла. Возможно, при использовании двойного цикла.

Примечание: Я изменил ваш is not к !=, и ваш 0 к 0.0 (последний более так, чтобы было понятно, что мы по сравнению с плавающей точкой с плавающей точкой).
Потому что вы сравниваете float с int, чтобы они никогда не были тем же самым предметом. Кроме того, сравнение чисел с помощью is это плохая идея:

>>> 2*3 is 6 # this may work, but don't rely on it 
True 
>>> 10*60 is 600 # this obviously doesn't work 
False 
>>> 0 is 0 # sure, this works... 
True 
>>> 0.0 is 0 # but this doesn't: float vs int 
False 

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

  • со списком понимания внутри списка понимания *:

    [val for val in [uniform(-2, 2) for i in range(10)] if val != 0] 
    
  • Использование NumPy:

    vals = uniform(-2, 2, 10) 
    vals = vals[vals!=0] 
    

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