1. 程式人生 > >Python——偽隨機數生成器

Python——偽隨機數生成器

偽隨機數生成器顧名思義就是它能產生隨機數!,實際上這種生成器就是一個小演算法,通過一定的演算法去生成一個個的隨機數。
現在網上流行的偽隨機生成器的演算法大致分為兩種:
1.平方取中法
2.線性同餘法

線性同餘法的隨機概率更大一點,相對於平方取中法,隨機性更好一點,以下我要講的也是關於線性同餘法產生隨機數的方法。

 線性同餘法的公式: rNew=(a*rOld+b) % (end-start)
 其中:	rNew為新種子,a成為乘數,b稱為增量,(end-start)稱為模數,他們均為常數,然後設定rOld = rNew ,一般要求使用者指定種子數rOld(也叫seed),當然也可以自由選擇a和b,但是這兩個數字選的不好的話,會影響數字的隨機性。
       經過數學家的計算,a,b 最好的值是: a=32310901  ,b=1729

以下程式碼會以時間為種子(每個時間都是不一樣的,這意味著種子不會重複,大大的提高了隨機性),以當前時間作為種子,迴圈得到十個時間種子,每個時間種子會隨機生成十個數。

''' 惰性求值    yield  即:你需要時才獲取,包含yield語句得函式可以用來建立生成器物件,這樣得函式也稱生成器函式,每次執行到yiled語句會返回一個值然後暫停或掛起後面得程式碼得執行,下次通過生成器物件得__next()__方法,內建函式x.next(),for 迴圈遍歷生成器物件元素或其他方式顯示“索要”資料恢復執行。'''

from random import randint
import time

def myrandint( start,end,seed=999999999 ):
    a=32310901
    b=1729
    rOld=seed   #將種子seed賦值給rOld
    m=end-start   #得到m 模數
    while True:
        rNew=int(( a*rOld+b )%m)   #開始產生隨機數
         yield rNew     #遇到yield關鍵字暫時掛起後面的程式碼,等帶next(r)的呼叫並返回 rNew
        rOld=rNew

#模擬使用10個不同得時間種子來生成隨機數
'''  獲得時間戳,由於計算機執行較快,可能計算機在同一個時間內迴圈了多次,這會導致時間種子相同的問題。所以保險起見,我用一個隨機函式產生的隨機數與其相加,更好避免出現重複種子的現象 '''
for i in range(10):      
    now=time.time()+randint(0,99999)     #時間戳加一個隨機數作為種子
    print(now)
    r=myrandint(1,10000,now)     #把時間種子作為引數呼叫myrandint函式
    #每個種子生成10個隨機數
    print( "種子",now,"生成的隨機數:" )
    for j in range(10):
	#使用next()函式迴圈遍歷r生成器物件來得到十個隨機數
        print( next(r),end="," )   
    print()

執行結果:
在這裡插入圖片描述

小夥伴們如果有改善的建議請評論哦,謝謝支援~