隨機數生成器中的種子到底是什麼?
我嘗試了一些常用的谷歌搜索等,但我發現的大多數答案要么有些模棱兩可,要么是特定於語言/庫的,例如 Python 或 C++
stdlib.h
等。我正在尋找與語言無關的數學答案,而不是庫的細節。例如,許多人說種子是隨機數生成器的起點,相同的種子總是產生相同的隨機數。這是什麼意思?這是否意味著輸出數是特定種子的確定性函數,隨機性來自種子的值?但如果是這樣的話,那麼通過提供種子,我們程序員是不是在創造隨機性而不是讓機器來做呢?
另外,在這種情況下,起點意味著什麼?這是一種不嚴謹的表達方式嗎地圖域的? 還是我有什麼問題?
大多數偽隨機數生成器 (PRNG)都建立在涉及某種遞歸方法的算法上,該算法從由稱為“種子”的輸入確定的基值開始。大多數統計軟件(R、Python、Stata 等)中的默認 PRNG 是Mersenne Twister 算法MT19937,該算法在Matsumoto 和 Nishimura (1998)中有闡述。這是一個複雜的算法,因此如果您想詳細了解它的工作原理,最好閱讀有關它的論文。在這個特定的算法中,存在度的遞歸關係,並且您的輸入種子是一組初始向量. 該算法使用線性遞歸關係生成:
在哪裡和和是可以在算法中指定為參數的對象。由於種子給出了初始向量集(並給出了算法的其他固定參數),因此算法生成的一系列偽隨機數是固定的。如果更改種子,則更改初始向量,這會更改算法生成的偽隨機數。這當然是種子的功能。
現在,需要注意的是,這只是一個使用 MT19937 算法的示例。有許多 PRNG 可以在統計軟件中使用,並且它們各自涉及不同的遞歸方法,因此種子在它們中的每一個中意味著不同的事物(從技術角度來說)。
R
您可以在本文檔中找到一個 PRNG 庫,其中列出了可用的算法和描述這些算法的論文。種子的目的是允許用戶“鎖定”偽隨機數生成器,以允許可複制的分析。一些分析師喜歡使用真正的隨機數生成器 (TRNG)設置種子,該生成器使用硬件輸入生成初始種子數,然後將其報告為鎖定數。如果種子是由原始用戶設置和報告的,那麼審核員可以重複分析並獲得與原始用戶相同的偽隨機數序列。如果種子沒有設置,那麼算法通常會使用某種默認種子(例如,來自系統時鐘),並且通常不可能複制隨機化。