作者: 人生若只如初見
計算機產生隨機數在概率算法設計中,隨機數分為真隨機數和偽隨機數,計算機只能產生偽隨機數。真隨機數:類似放射性元素的衰變等無法控制的且無法複製數據偽隨機數:通過較為容量大的數學公式產生的數字,具有可猜測性。在得到生成器的隨機數種子之後,可以通過計算得到偽隨機數序列。通用性偽隨機數生成器:s0=seed,s[i+1]=f(s[i]),推廣形式:s[i+1]=f(s[i],s[i-1],……,s[i-t]),其中t是固定整數。滿足通用性偽隨機數的推廣的例子,線性同餘生成器:s0=seed,s[i+1]=a*s[i]+b mod m,(i=0,1,2……)線性同餘生成器線性同餘序列的周期1、存在遞推關係:x[i+1]=f(x[i])
2、其中的任意元素x[i]都在[0,m-1]範圍內
3、f(x)的值也在[0,m-1]範圍內
1、假設兩個集合s={0,1,2,3,……,m-2,m-1} size(s)=m
T={} size(T)=0
將產生的偽隨機數挪到集合T中
2、先生成第一個偽隨機數x1
s={0,1,2,3,……,m-2,m-1} size(s)=m
T={x1} size(T)=1
3、根據第一個偽隨機數x1生成第二個偽隨機數x2,判斷x2的歸屬,若x2屬於集合s則一個周期還未結束,若x2屬於集合T此處正好等於x1則一個周期產生,周期p=1
推論到x[i]即生成的每個x都屬於s,都轉移到T
此時:s={0,1,2,3,……,m-2,m-1} size(s)=m
T={x1,x2,x3,……,x[i-2],x[i-1]} size(T)=i-1
若x[i]=f(x[i-1])∈s,則未能完成一周期
若x[i]=f(x[i-1])∈T,則已完成一個周期,周期p≤i-1
周期p也可能等於m,也就是最終s為空集,T中包含0到m-1的所有元素,且f(X[m])=x1
因此一定存在一個周期p≤m
推論:
1) 當周期p<m時,選取不同的隨機數種子也就是x0(初始值)產生的周期可能會不同。
2) 當周期p=m時,序列的周期與初始值x0無關,周期必定為p。
lcg1=(a*lcg0+c)%m lcg2=(a*lcg1+c)%m
兩式相減 左邊為:lcg2-lcg1 右邊為:(a*lcg1+c)-(a*lcg0+c)
化簡為: [lcg2-lcg1=a*(lcg1-lcg0) ] %m
根據求餘運算規則可知
[a=(lcg2-lcg1)*gmpy2.invert(lcg1-lcg0,m)]%m
此時代入lcg0,lcg1,lcg2之後可求得a
代入lcg1=(a*lcg0+c)%m,把c當作未知數放到等式左邊後,式子為:
c=[lcg1-(a*lcg0)]%m
類推lcg3_guess=(a*lcg2+c)%m
將求得地lcg3_guess與lcg3比較,如果相等,證明求得的a,c,m為正確值
否則,m=m+1,繼續驗證
注意:
1、這個式子成立條件是兩邊同時對m求餘
2、gmpy2.invert(x1,x2)是求與x1%x2同餘的最小數,二者在求餘操作後等價,因為餘數相等,該式表示餘數,類似7%5=2%5