1. 程式人生 > >python3 線性同餘發生器 ( random 隨機數生成器 ) 偽隨機數產生週期的一些探究

python3 線性同餘發生器 ( random 隨機數生成器 ) 偽隨機數產生週期的一些探究

import random
x=[str(random.randint(0, 5)) for i in range(10)]
x_str=''.join(x)

y=[str(random.randint(0, 5)) for i in range(100000000)]
y_str=''.join(y)

if x_str in y_str:
    print("共有多少:")
    print(y_str.count(x_str))
    print('第一個出現位置')
    print(y_str.find(x_str))
else:
    print("沒有")

 

如上面程式碼所示, 突然想起來程式語言中的隨機數產生是採用線性同餘發生器產生的,那麼既然是尾隨機數它必然有重複的時候,那麼我們有沒有可能找到它重複的時候,或者發行一個週期呢,所以由此寫了上面的程式碼。

 

注: 該程式碼比較吃記憶體沒有16G 記憶體的電腦可能是跑不了上面的程式碼的。

 

 

 

 

 

一共跑了兩次, 結果如下圖:

 

 

 

 

首先並沒有發現什麼週期可言,估計這個笨方法是發現不了的,前提是它真的有周期;

其次, 我們發現及時是5以內的整數, 產生的序列出現重複的時候都是要1000萬個數生成以後才會出現重複的序列;

最後,我們知道偽隨機數是會出現重複的,但是我們能遇到的可能性不大,理論上存在,實踐中可以不考慮。

 

附加:

如果隨機數的產生設定為 100以內的整數,  跑了N多次也沒有發現重複的序列。  即修改上面程式碼:

random.randint(0, 5)  為
random.randint(0, 100)


由此可以發現偽隨機數其實還是比較靠譜的。