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