Python random.uniform不生成0

时间:2016-11-08 12:19:57

标签: python-3.x random uniform

我想使用random.uniformfloat之间生成[-2, 2],但不生成0,这就是我在循环中执行的方式,

from random import uniform

flag = True

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

我想知道有更好的方法吗?

欢呼声

1 个答案:

答案 0 :(得分:1)

这更适用于Code Review,但非常简短:

from random import uniform

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

可能是更多Pythonic /标准方式(标准,因为这种模式也出现在其他语言中)。

很少需要flag变量来突破(while)循环。也许在使用双循环时。

注意:我将您的is not更改为!=,将0更改为0.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]
    

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