2013-11-27 53 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的,但得到它倒退,所以固定的看到自己的代碼之後]