其實,我有幾個交織問題。 (如果它很重要,我使用C#)。縮放Int內統一的隨機範圍變成雙數
首先。我有一個在UInt32範圍內產生隨機數的prng,從0到UInt32.Max(含)。我想盡可能保持一致性。 (a,b),雙重範圍(如[0,1],[0,1),(0,1),[-2,4],( - 10,10))?
我很關心以下內容。我有4 294 967 296個成果。它小於[0,1]的雙數範圍中的數字 - 2^53。所以我從2位數字構造了4 294 967 296-ary數字,這在[0,4294967295 * 4294967296 + 4294967295]中是隨機的和統一的。這個最大值大於1^2^53,所以如果有人把它扔掉了,重新計算,使用mod 2^53並且得到統一的數字,例如[0,1]。在這裏,我必須將最大值表示爲double(假設沒有Int64類型) - 它有沒有什麼缺點?現在,如果我想得到[0,1),我認爲結果的數目是(2^53) - 1。加上最後的結果1 /(2^53)將產生隨機雙0,1]。爲了得到(0,1),我考慮(2^53) - 2個新的結果並將1 /(2^53)加到0爲基礎的結果。得到接近或等於整個雙倍範圍的雙倍範圍?即使我構造如上所述的n元數,它可能會變得比Double.Max大。可能有些位移/位掩碼方法有可能嗎?
其次。現在在[0,1)中有雙重結果,可以得到[Double.Min,Double.Max]範圍嗎?有多少個雙數?如果有完整的雙倍範圍prng,獲得UInt範圍的最佳方式是什麼?直接映射或直接映射到[0,1]之前?
三。我發現這個代碼(http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c):
/* generates a random number on [0,1) with 53-bit resolution*/
double genrand_res53(void)
{
unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
return(a*67108864.0+b)*(1.0/9007199254740992.0);
}
爲什麼A和B轉移到5和6,爲什麼之後a * 67108864.0 + b是統一的?
謝謝。