這個隨機數生成算法叫什麼名字?
我正在尋找 RNG 方法或算法的名稱,如下所述。組合非均勻隨機數生成器的多個結果可以產生更均勻的結果。看起來這將是 RNG 算法(尤其是 HRNG)採用的一種常用方法,以產生更具統計意義的隨機結果。
如果有人可以幫助辨識此方法的數學/統計/加密名稱,那就太棒了
下面的程式碼展示了這種方法的簡單實現,“壞”的 RNG 產生不均勻的結果,而“好”的 RNG 產生大約 50/50 的結果。
import random # Function representing a non-uniform random number generator def bad_RNG(): result = 0 if (random.random() > .99): result = 1 return result # Function that repeatedly applies an RNG function to create a more uniform result def good_RNG(): result = 0 for i in range(100): if (bad_RNG() != bad_RNG()): result = 1 - result return result # Tests RNG functions by running them 100 times, and printing the distribution of their results def test_RNG(RNG_func): zeros = 0 ones = 0 for i in range(100): result = RNG_func() if (0 == result): zeros = zeros + 1 else: ones = ones + 1 print(zeros, end="|") print(ones) print("bad_RNG result:") test_RNG(bad_RNG) print("\ngood_RNG result:") test_RNG(good_RNG)
另類英文解釋
假設一個 RNG 函式 F() 返回 0 或 1。F() 結果是不均勻的,因為它通常返回 0。通過將幾個 F() 結果相加並應用模數 2,結果接近 50/50均勻分佈。
所描述的算法是一種無偏算法,它是一種隨機性提取算法。
另一種方法是馮諾依曼無偏,你可以取 2 位 $ (X_n,X_{n+1}) $ 並輸出 $ Z=0 $ 如果 $ (X_n,X_{n+1})=(0,1), $ 輸出 $ Z=1, $ 如果 $ (X_n,X_{n+1})=(1,0), $ 否則丟棄這兩位。這給出了完全一致的輸出位,如果序列 $ X_n $ 是獨立同分佈的,因為以上兩者 $ (0,1),(1,0) $ 恰好有機率 $ p(1-p) $ .
good_RNG
可以被描述為:一個無偏(或隨機性提取,或後處理)算法的實現,執行 的 200 個連續輸出的異或bad_RNG
,使用以兩倍展開的循環,可能具有偶然的數據相關時序依賴於bad_RNG
.這是因為
- 什麼時候 $ \mathtt{foo}\in{0,1} $ 和 $ \mathtt{bar}\in{0,1} $ ,表達式
foo != bar
歸結為 $ \mathtt{foo}\oplus\mathtt{bar} $ 在哪裡 $ \oplus $ 是異或又名異或,可能與數據時序相關。
- 什麼時候 $ \mathtt{zoo}\in{0,1} $ 和 $ \mathtt{result}\in{0,1} $ ,程式碼
if (zoo):
result = 1 - result
歸結為 $ \mathtt{result}\gets\mathtt{result}\oplus\mathtt{zoo} $ ,可能與數據時序相關。
- $ \oplus $ 是關聯的。
在專業實踐中,對這些事實缺乏評論將是應受懲罰的罪行。
我懷疑這種基本方法有一個特定的名稱。如果有的話,在FSE 2007 的訴訟程序中 Markus Dichtl 的Bad and Good Ways of Post-Processing Biased Physical Random Numbers中沒有給出(關於好的):
可能最簡單的方法是 XOR $ n $ 來自生成器的位,以便獲得一位輸出,其中 $ n $ 是大於的固定整數 $ 1 $ .
這就是
good_RNG
為 $ n=200 $ .