2013-11-27 75 views
1

排除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

什么地方错了这种方法,它必须是最快的国家之一 – alko

+0

如果您用'x = random.uniform(-1.5,1.5)'代替'x = 0',那么你的接受/拒绝方法将比在半范围上生成的提议更有效率,并使用第二个随机数来翻转标志。 – pjs

回答

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 - v0.0 <= range < 1.5

否则,1.5 <= v < 3.0,你得到v - 3.0,所以0.0 > range >= -1.5

+0

+1,因为它是无条件地执行它的方式,如问题所述。不过,我可能会用 –

+0

这个问题的例子来解决这个问题,这并非没有条件,条件是“随机决定否定结果”。这个解决方案需要对生成的每个值加上random()的两次调用以及是否否定的条件,并且要比检查零并且必须每2 ** 31个值大约生成一次第二个值的效率低。 – pjs

+0

绝对 - 一般来说这并不比原来的解决方案更有效率。但是,有一种方法只使用一个随机电话,我已经在上面列出了。 – creichen

2

你在做什么是好的(没有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的,但得到它倒退,所以固定的看到自己的代码之后]