2015-09-23 43 views
3

重疊如果我用設定種子爲0,調用rand()三次後,我會得到這個序列:不同的種子將PRNG序列用C

38, 7719, 21238, ..., 

如果我設置種子1(srand(1))我會得到這個其他序列:

41, 18467, 6334, ..., 

我知道這是非常不可能的,但會的srand(1)序列的srand(0)在一些點序列中存在?我的意思是,使用srand(0)將得到:

38, 7719, 21238, ..., ..., ..., 41, 18467, 6334, ...,? 

謝謝!

+2

這取決於。 PRNG可以形成一個或多個週期。如果0和1在同一個循環中,那麼是的,你最終會看到你用'srand(1)''srand(0)'得到的序列。實際上,兩個序列都是一樣的,但是有一些變化。另一方面,如果他們處於不同的週期,你將不會看到任何共同的數字。 – rlbond

+1

這不是由標準定義的。 – Olaf

回答

3

雖然它沒有被標準定義 - 您的問題的答案是肯定的,它取決於使用的算法,通常是線性同餘發生器(LCG)。 LCG在交叉自相關方面被認爲是很高的。查看rand在您的平臺中的實現方式,可以讓您更好地表徵它。這裏是一個例子Rand Implementation

3

對於rand,它沒有被標準規定,但在C標準中提出的示例實現肯定會產生重疊序列(實際上只有一個序列,而種子只是起點)。

如果您需要更強大的屬性,您需要選擇合適的PRNG,而不僅僅使用rand。保證沒有重疊的長度-N子序列對於體面的PRNG將是非常難以證明的,並且關於合理大小的N的簡單證明或者甚至是該真實性的陳述將表示非常差的0129。但很容易保證,對於具有足夠大的狀態的良好PRNG,不同的種子不會產生完全相同的序列,只是從不同的點開始。

+0

除非我誤解了第二段,否則我不認爲這是正確的。 PRNG可以獨立於任何其他品質生成非重疊序列。所需要的只是一個將內部狀態提前N次的函數,而實際上不需要O(N)計算。在許多情況下,在基於計數器值的加密的PRNG的情況下,使用矩陣求冪的O(log(n))時間或甚至O(1)時間是可能的。 Philox。知道發生器的週期和前進函數可以產生多個指定長度的非重疊序列。 – njuffa

+0

我在說的是如果你不希望子序列{42,12345,98}出現在你的序列中多於一個種子,這個(1)意味着你的PRNG具有不好的統計特性,並且(2)除非您的PRNG具有使其變壞的屬性(例如相對於可能的輸出數量的較低週期),否則難以實現。 –

2

實際的答案是它取決於生成器的實現,這在標準中沒有定義。甚至對於線性同餘發生器(LCG)也是如此,LCG通常用作rand的默認實現。

一個LCG是形式

state = (A * state + B) % M 

合適整數值常量AB,和M復發關係。設置種子初始化state

ABM一些選擇,就不會達到充分循環(相對於模量M),在這種情況下,可以LCG產生兩個或多個非重疊的子序列。例如,對於A = 3,B = 0M = 11,您將根據您的種子值發現自己處於兩個不重疊的子循環之一。 播種1將產生以下序列:

3,9,5,4,1,3,9,5,4,1,3,9... 

和播種2將產生:

6,7,10,8,2,6,7,10,8,2,6,7... 

係數的其它選擇可以實現充分循環。在任何一種情況下,種子值都對應於選擇一個循環或子循環的入口點。

對於維持較大狀態空間並摺疊狀態以產生每個報告值的其他類生成器,您可以重複單個值而不重複相同的序列,直到您列舉了整個(不可見)狀態空間。這就是Mersenne Twister等發電機如何實現週期長度的原因,如2 -1。不同的(非常大的)狀態可以摺疊爲相同的32位或64位數量,但對於下一個值將導致完全不同的狀態被計算(和摺疊),因此您將看到重複的單個值而不會看到重複一系列值。

相關問題