Python生成隨機數(shù)隨機種子“失效”:Jupyter中不同cell中生成的隨機數(shù)不一致
在Python中經(jīng)常會生成很多隨機數(shù),例如Python自帶的random庫、科學(xué)計算庫NumPy、深度學(xué)習(xí)框架PyTorch等都可以生成隨機數(shù)。
同時為了固定生產(chǎn)的隨機數(shù)、使得隨機數(shù)生成可復(fù)現(xiàn),很多時候都會設(shè)置隨機種子,這樣每次都能生成固定的隨機數(shù),這樣給我們的感覺就像“只要設(shè)置了隨機數(shù),后面每一次生成的隨機數(shù)都是一樣的”,但是實際上不是這樣的:
可以看到,3個庫在設(shè)置隨機種子后,生成的3個隨機數(shù)都是不同的,所以我們之前的哪種理解是錯誤的,隨機種子固定的是隨機過程,而不是每一個隨機數(shù)本身:
對于上面的例子來說,這三次輸出結(jié)果是通過設(shè)置隨機數(shù)種子確定的,從設(shè)置隨機數(shù)開始,相同的隨機數(shù)種子后面隨機的過程是固定的,第1個cell是隨機過程輸出的第1個結(jié)果,第2個cell是這個固定過程的第2個結(jié)果,以此類推。這3個cell輸出了3個結(jié)果,可以理解成是當(dāng)前種子下的隨機過程輸出的連續(xù)結(jié)果,這3個結(jié)果的順序和數(shù)值是當(dāng)前這個隨機數(shù)種子決定的。因此,雖然每次生成的隨機數(shù)結(jié)果不同,但是再運行一次這3個cell,生成的3個隨機數(shù)還是與之前生成的隨機數(shù)對應(yīng)相等的,這就是隨機數(shù)種子確定隨機過程,而不是固定這個過程中每一個取值都相同。只要設(shè)置了相同的隨機數(shù),就會生成一個固定的隨機過程,那么不管執(zhí)行多少次過程,生成的這些隨機數(shù)都是不變的,只不過每一次結(jié)果序列中的各個隨機數(shù)并不保證一致。同時,隨機結(jié)果與是否在Jupyter中運行并無關(guān)系,在.py文件中運行結(jié)果也相同,如下:
可以看到,每次的結(jié)果并不相同,同時過程是固定的,與Jupyter中是一致的。
作者:cutercorley
歡迎關(guān)注微信公眾號 :Python極客部落