2009-01-15 145 views
0

我想在給定範圍內生成均勻分佈的隨機整數。我正在使用的解釋語言有一個內置快速隨機數生成器,它返回範圍爲0(包含)到1(包含)範圍內的浮點數。不幸的是,這意味着我不能使用standard solution seen in another SO question(當RNG之間返回0(包括數字)到1(不包括)),用於在給定的範圍內產生均勻分佈的隨機整數:在給定範圍內生成均勻隨機偏差

result=Int((highest - lowest + 1) * RNG() + lowest) 

唯一明智的方法目前我可以看到,在罕見的情況下,隨機數發生器返回1以請求新的號碼。

但是如果有人知道更好的方法,我很樂意聽到它。

羅布

注意:將現有的隨機數發生器,以這種語言會導致infeasibly緩慢,恐怕這不是一個可行的解決方案的東西。

編輯:鏈接到實際的答案。

+0

你還沒有解釋爲什麼上述解決方案不起作用。如果隨機數發生器是一個很好的隨機數的近似值,那麼它的結果分佈應該是一致的,計算結果也是一樣的。 – Simon 2009-01-15 09:39:49

+0

因爲RNG的範圍是0(包括)到1(包括),所以我們可能以結果=最高+ 1(即在期望範圍外)結束 – RobS 2009-01-15 09:54:59

回答

1

想必你對速度非常感興趣,否則你只會在每次RNG呼叫時吸食有條件的測試。任何其他的選擇可能會比分支慢...

...除非你確切知道RNG的內部結構是什麼。特別是,它的返回值是什麼?如果它們不是IEEE-754浮標或雙打,那麼我有同感。如果是這樣,它們中有多少個真實的隨機性?你會期望24浮動和53雙打(尾數位數)。如果這些是天真地生成的,你可能可以使用輪班和掩碼將一個簡單的舊隨機整數生成器一起破解掉,然後在你的函數中使用它(取決於你的範圍的大小,你可以使用如果你有這樣的發電機,更多的班次和口罩可以避免任何分支)。如果你有一個高質量的發生器產生全質量的24位或53位隨機數,那麼你可以用一個乘法將它們從[0,1]轉換爲[0,1]:乘以最大的可生成的浮點數點數小於1,並且你的範圍問題消失了。如果mantissas沒有完全填充隨機位,這個技巧仍然可以工作,但是你需要做更多的工作來找到合適的乘法器。

你可能想看看C source to the Mersenne Twister看到他們對類似問題的處理。

-1

我不明白爲什麼需要+ 1。如果隨機數發生器產生在[0,1]區間則值的均勻分佈...

result = lowest + (rng() * (highest - lowest)) 

應該給你值的最低

之間

rng() == 0, result = lowest + 0 = lowest

和unform分佈最高

rng() == 1, result = lowest + highest - lowest = highest

包含+ 1指該上限將所生成的數量可以高於最高

rng() == 1, result = lowest + highest - lowest + 1 = highest + 1

由此產生的值分佈將與隨機數的分佈相同,因此均勻性取決於隨機數生成器的質量。

從您的評論下面,你是正確的指出,Int()將成爲拖尾分佈在尾部的來源。最好使用Round()到最近的整數或任何你在腳本語言中的等價物。

+0

這是不正確的,例如最低= 0和最高= 9。當RNG = 1時只輸出9,但當RNG的輸出介於0和0.1之間時輸出0 – RobS 2009-01-15 09:55:36