我想要一个介于-1.5和1.5之间的数字,但这不应该是0.
我正在使用:
x = random.uniform( -1.5, 1.5 )
但我必须写一个条件来排除0,如:
x = 0
while (x==0):
x = random.uniform( -1.5, 1.5 )
在没有条件的情况下写这个是否是另一种可能性?
答案 0 :(得分:6)
你可以尝试
1.5 * (1.0 - random.random())
然后随机决定是否否定结果。从random.random() < 1.0
开始,你应该(数字上)不得零。
修改强>:
已经(正确地)指出这需要两个随机决定。要做出一个随机决定,请使用以下内容:
v = 3.0 * random.random()
result = 1.5 - v
if v >= 1.5:
result = v - 3.0
如果0.0 <= v < 1.5
,则会获得1.5 - v
和0.0 <= range < 1.5
。
否则,1.5 <= v < 3.0
,您得到v - 3.0
,所以0.0 > range >= -1.5
。
答案 1 :(得分:2)
你正在做的事情很好(这没有api方法),但我怀疑你应该有更多的东西:
epsilon = 1e-10 # for example
while abs(x) < epsilon: x = random.uniform(-1.5, 1.5)
因为避免零的最可能原因是出于数字原因,通常非常小的非零值也会导致问题。
你可以做的另一件事是利用random()的半开放性质:
x = 1.5 * (1 - random.random())
if random.randint(0, 1): x = -x
但我觉得你的代码更清晰(虽然上面看起来在技术上是正确的,但我不确定我是否相信它在所有情况下都有舍入等)。
[编辑:我提出了半开放的想法,独立于creichen,但得到它倒退,所以看到他们的代码后修复]