2012-05-12 40 views
1

我現在的功能是這樣:如何將32位隨機函數輸出縮放爲0 ... 1的值而不會失去精度?

float random(){ 
    return (float)rand_xor128()/UINT_MAX; 
} 

但後來我意識到,一旦值轉換爲浮動,它會失去精度,對不對?

我應該首先將其轉換爲加倍也許?

float random(){ 
    return (float)((double)rand_xor128()/UINT_MAX); 
} 

但它感覺不到正確的做法。我應該怎麼做?

+0

[基於隨機比特流中生成隨機浮點值]的可能重複(http://stackoverflow.com/questions/5015133/generating-random-floating-point-values-based-on-random-bit-流) –

回答

0

你必須要擠進範圍[0,1)的32位值。這要求您能夠在該範圍內表示2^32不同的值。

A float有2^32個可能的值總計。換句話說,一個浮動永遠不會做你需要的東西。如果返回了一倍,你可能能夠做到這一點(我沒有運行數字來準確地確定它),但除此之外,你必須寫自己的數據類型,它不正是你需要的。

但是,如果你認爲值存儲到一個浮動,你會失去精度,因爲它根本沒有在[0,1足夠的精度)範圍內,以滿足您的要求。

+0

哦,你是對的。當然float不能代表它的整個範圍,我的不好。 – Rookie

相關問題