2016-11-08 67 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 

是可能做到这一点(标准更Python /标准的方式,在这种模式在其他语言中出现以及)。

很少有flag变量需要跳出(while)循环。也许在使用双循环时。

注意:我改变了你对is not!=,和你的00.0(后者更使得它很清楚,我们要比较一个浮动的浮动)。
因为您将floatint进行比较,所以它们不会是同一个项目。此外,使用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] 
    

*我不想把它称为嵌套的,因为我觉得属于稍微不同的双列表理解。