2015-02-05 37 views
3

假設我有一個足夠好的(tm)隨機字節數據流,是否有一種數學方法可將它們轉換爲(0 < n < 1)個浮點值不需要知道浮點數的內部格式?從隨機字節中生成隨機數字而不會發生比特錯誤

我在尋找的東西:

  • 不需要按位運算(彩車上),並且
  • 是一個反覆的過程,我們可以知道後會給一個很好的價值n次迭代,其中n是輸出精度的函數。
  • 通過簡單地改變迭代次數,即消耗更多的輸入字節來產生一個比單精度浮點數多的浮點數,可以用於任何精度浮點數的一般過程。

天真的解決方案是從自己的幾個字節構建一個大整數,然後簡單地轉換爲浮動除以2^n,但我不明白如何去做,而不會搞亂分配。

另一個想法是這樣的(僞):

state := 0.0 
n := requiredIterations(outputPrecision) 
for(1..n) 
    nextByte := getRandomByte() 
    state := state + nextByte 
    state := state/256 
end 
return state 

看起來這應該工作,但我不知道如何來證明這一點:)

+4

是什麼分佈你試圖達到?統一在[0,1)?或者你是否試圖產生相同數量的每個雙數的隨機數?它能夠在[0,1)中擊中每個可能的浮點數有多重要? – njuffa 2015-02-06 01:09:35

+0

「另一個想法」如何與構建一個大整數並將其分開?它看起來好像你只是在組合字節的時候那樣做了兩個部分的力量。 – 2015-02-06 02:16:03

+0

你是什麼意思「弄亂分佈」?將4個字節組合成4字節的實體看起來確實是獲得所謂的生成器的方法 – 2015-02-06 03:18:23

回答

3

好吧,我想我已經得到了你所需要的

讓我們以下面的方式考慮在範圍[0 ... 1)內對浮點數進行採樣。 256是2^8,相當於下一個字節移位。讓我們結合字節

b0*256*256*256 + b1*256*256 + b2*256 + b3 

要獲得0號[... 1)範圍內你必須256 * 256 * 256 * 256來劃分它,從而

f = b0/256 + b1/(256*256) + b2/(256*256*256) + b3/(256*256*256*256) 

,反過來,相當於多項式計算霍納方案

f = (1/256)*(b0 + (1/256)*(b1 + (1/256)*(b2 + (1/256)*b3))) 

反過來,幾乎你寫了什麼(對於一些抽象的N)

+0

我認爲這是我正在尋找的保證,乾杯:D – Sophistifunk 2015-02-08 22:53:20

-1

由於塞韋林Pappadeux說,爲什麼不只是這樣做

const double factor = 2.32830643653869628906e-10; // 2^(-32) 
unsigned int accumulator = 0; 
for (int i = 0; i != 4; ++i) 
{ 
    accumulator <<= 8; 
    accumulator |= getRandomByte(); 
} 
double r = factor * accumulator;