Algorithm-Design

這個隨機數生成算法叫什麼名字?

  • June 27, 2020

我正在尋找 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 $ .

引用自:https://crypto.stackexchange.com/questions/81546