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