在我的嵌入式項目中,我有一個處理任意長度整數的biginteger類。我希望能夠在0和任意數字之間生成一個隨機bigint。假設我有一個隨機字節的質量來源。如何在常量時間內生成無偏差的隨機bigint
所有我見過的實現基本上是做同樣的事情:
- 生成正確數量的字節一個大數目,
- 如果大於max,再次生成。
我在這個實現中看到的問題是,它可能需要很長時間。想象一下,max = 2^2049-1
=(01 FF .. FF
)。該算法將生成257個字節,然後檢查最高有效字節是<=1
。所以有254/256的機會需要產生一個全新的257字節的數字。在(不可能)最糟糕的情況下,這個循環可能持續數分鐘或數年。
我的問題是:
在生成的數字太大的情況下,有沒有辦法保留我已經生成的大部分字節?
重新生成最重要的字節有效嗎,還是會引入偏差?如何將結果轉換爲一位數字?
有什麼辦法可以確保時間,同時避免偏差嗎?
-
另一個邊緣情況:max = 2^2048 + 1
=(01 00 .. 01
)在這種情況下,最顯著字節可爲非零值,如果剩下的字節是0,接着一個或00
01
。所以大多數情況下,如果MSB不爲零,則它將無效,只是重新生成該字節將永遠無法使其生效。但只是強制設置爲零似乎也是錯誤的。
我沒有看到如何重新生成只有一部分的字節可能會引入偏見。你只是用其他隨機字節替換一些隨機字節。實質上,您的問題歸結爲選擇0到255之間的n個隨機數,以及一個範圍更低的隨機數。對我來說似乎是一個簡單而明顯的解決方案。另一方面右移會引起偏見,在你的例子中,你從來沒有右移00或01的數字 – HugoRune