排除0我想和-1.5 1.5拿起了号码,但0随机在python
我用这不应该是:
x = random.uniform(-1.5, 1.5)
,但我必须写一个条件排除0像:
x = 0
while (x==0):
x = random.uniform(-1.5, 1.5)
这是不是另一种可能性没有条件写这个吗?
排除0我想和-1.5 1.5拿起了号码,但0随机在python
我用这不应该是:
x = random.uniform(-1.5, 1.5)
,但我必须写一个条件排除0像:
x = 0
while (x==0):
x = random.uniform(-1.5, 1.5)
这是不是另一种可能性没有条件写这个吗?
您可以尝试
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
。
你在做什么是好的(没有API方法这一点),但我怀疑,你应该有更多的东西一样:
epsilon = 1e-10 # for example
while abs(x) < epsilon: x = random.uniform(-1.5, 1.5)
因为最有可能的原因,以避免零是数字的原因,通常非常小的非零值也会导致问题。
一个你可以做的另一件事是采取随机()的半开放性的优势:
x = 1.5 * (1 - random.random())
if random.randint(0, 1): x = -x
,但我认为你的代码更清晰(并且在上面看起来技术上是正确的我是不确定我在所有情况下都信任它,舍入等)。
[编辑:我想出了半开放式的想法独立creichen的,但得到它倒退,所以固定的看到自己的代码之后]
什么地方错了这种方法,它必须是最快的国家之一 – alko
如果您用'x = random.uniform(-1.5,1.5)'代替'x = 0',那么你的接受/拒绝方法将比在半范围上生成的提议更有效率,并使用第二个随机数来翻转标志。 – pjs