2014-04-29 55 views
2

因此,我使用XORShift生成器的Wikipedia entry來生成PRNG。我的代碼如下。使用XORShift生成器生成雙精度

uint32_t xor128(void) { 
    static uint32_t x = 123456789; 
    static uint32_t y = 362436069; 
    static uint32_t z = 521288629; 
    static uint32_t w = 88675123; 
    uint32_t t; 

    t = x^(x << 11); 
    x = y; y = z; z = w; 
    return w = w^(w >> 19)^t^(t >> 8); 
} 

我的問題是,我怎麼能用這個來產生[0,1]之間的雙數?

感謝您的任何幫助。

回答

2

只需將返回的uint32_t除以最大值uint32_t(作爲雙精度類型)。不過,這確實有大約四十億的可能性。如果您願意,您可以進行最大限度的測試並丟棄它。

2

假設你想均勻分佈,而不是太挑剔隨機化所有的位爲非常小的數字:

double xor128d(void) { 
    return xor128()/4294967296.0; 
} 

由於xor128()不能返回4294967296,結果不能準確1.0 - 然而, ,如果你返回一個浮動,它可能仍然是上調到1.0f。

如果您嘗試添加更多位以填充整個尾數,那麼您將面臨雙打同樣的四捨五入頭痛。

你想讓整個尾數隨機化所有可能的值嗎?這有點困難。