python3 線性同餘發生器 ( random 隨機數生成器 ) 偽隨機數產生週期的一些探究
阿新 • • 發佈:2018-12-27
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)
由此可以發現偽隨機數其實還是比較靠譜的。