天天看點

關于Numpy中np.random.seed()随機種子用法

np.random.seed() 使随機數可預測

随機種子seed括号裡的數,顧名思義, 好像就是一個固定的序列集合的種子代号,例如代号0(如:0,1,2,3,4…),中包含一大串随機數,但都是固定的,是以,無論後面怎麼random.random,生成的随機數都是seed(0)集合中的随機數。

import numpy as np
from icecream import ic

if __name__ == '__main__':
    np.random.seed(0)   # 随機種子代号自己設定
    x1 = np.random.random(3) 
    ic(x1)      

第一次:

ic| x1: array([0.5488135 , 0.71518937, 0.60276338])

第二次:

多次運作後,你會發現每次的值都是一樣的。

是以,想要取不同的随機數,可設定seed()内的不同種子代号。

當然還有另外一種方法能讓每次取得随機數組都是不一樣的,删掉seed()語句,直接random就好了。

import numpy as np
from icecream import ic

if __name__ == '__main__':
    x1 = np.random.random(3) 
    ic(x1)      

ic| x1: array([0.93113248, 0.16477415, 0.11086242])

ic| x1: array([0.57306252, 0.54383123, 0.23124207])

第三次:

ic| x1: array([0.14004845, 0.51201779, 0.67705872])

後面每次都是不同的

曾看到過這樣一個解釋覺得不錯:

(僞)随機數的工作原理是從一個數字(種子)開始,将它乘以一個大數,加上一個偏移量,然後對該和取模。然後将結果數用作種子以生成下一個“随機”數。當你設定種子時(每次),它每次都做同樣的事情,給你相同的數字。

隻設定一次種子,後續不重置,放在一起來看:

import numpy as np
from icecream import ic

if __name__ == '__main__':
    np.random.seed(0)
    x1 = np.random.random(3)
    ic(x1)
    x2 = np.random.random(3)
    ic(x2)
    x3 = np.random.random(3)
    ic(x3)
    x4 = np.random.random(3)
    ic(x4)
    x5 = np.random.random(3)
    ic(x5)      

Result:

ic| x2: array([0.54488318, 0.4236548 , 0.64589411])

ic| x3: array([0.43758721, 0.891773 , 0.96366276])

ic| x4: array([0.38344152, 0.79172504, 0.52889492])

ic| x5: array([0.56804456, 0.92559664, 0.07103606])

總結

如果想要看似随機的數字,不要設定種子。但是,如果有要調試的使用随機數的代碼,那麼在每次運作之前設定種子會非常有幫助,這樣代碼每次運作時都會做同樣的事情。