是否有一个不生成0的Python random.random()模拟

时间:2014-07-11 04:06:52

标签: python random divide-by-zero

我正在编写一些需要通过随机浮动进行除法的函数,虽然它高度不可能它会抛出ZeroDivisionError,但我无法入睡直到我胜利积极。是否有一个用于Python的random.random()模拟,它是0独占的。

5 个答案:

答案 0 :(得分:5)

正如凯文·克里斯托弗·亨利所指出的那样random.random返回值[0.0,1.0],很容易通过以下方式将其转换为(0.0,1.0)而没有任何条件代码:

1.0 - random.random()

答案 1 :(得分:2)

如果您不介意编写自己的功能,请参阅:

def rand():
    x = 0
    while x == 0:
            x = random.random()
    return x

这会随机选择一个随机浮点直到随机浮点数不等于0,然后返回它:

>>> def rand():
...     x = 0
...     while x == 0:
...             x = random.random()
...     return x
... 
>>> rand()
0.8330963681114979
>>> rand()
0.6061231841612397
>>> rand()
0.10548161965303249
>>> rand()
0.6102130916030852

答案 2 :(得分:1)

一种方法是将其从[0.0,1.0]转换为(0.0,1.0):

def nonzero_random():
    return random.random() or 1.0

答案 3 :(得分:1)

因此,如果我们有一个范围为[x, y)的函数,但我们希望它采用(x, y)的范围,那么C ++函数std::nextafter将解决这个问题。

可悲的是,库存python中没有提供类似的功能。我们可以在numpy中找到它。

random.uniform(numpy.nextafter(0, 1), 1)

如果您不想依赖numpy,也可以对数字进行硬编码:

random.uniform(5e-324, 1)

答案 4 :(得分:0)

尝试:

random.randrange(start, stop, step)

即使您被迫拥有一系列整数,也可以随时划分结果。

>>> random.randrange(1, 1000)/ float(1000)
0.428