假設我有一個足夠好的(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
看起來這應該工作,但我不知道如何來證明這一點:)
是什麼分佈你試圖達到?統一在[0,1)?或者你是否試圖產生相同數量的每個雙數的隨機數?它能夠在[0,1)中擊中每個可能的浮點數有多重要? – njuffa 2015-02-06 01:09:35
「另一個想法」如何與構建一個大整數並將其分開?它看起來好像你只是在組合字節的時候那樣做了兩個部分的力量。 – 2015-02-06 02:16:03
你是什麼意思「弄亂分佈」?將4個字節組合成4字節的實體看起來確實是獲得所謂的生成器的方法 – 2015-02-06 03:18:23