透過random模組生成的隨機數並非是真正完全隨機的,而是可以被重現的,因此這個特徵也被稱為是偽隨機(pseudo-random),而重現隨機數的方式便是透過設定相同的種子(seed),或是設定隨機數生成器的狀態(state)來達成。
設定隨機數生成器種子的方式如下:
random.seed([a])
- 當a被省略時,每次調用random模組的方法生成的數就會是隨機的。
- 當a被設定後,每次使用random.seed(a)後調用random模組的方法生成的數就會是同一個。
我們也可以在調用random模組前先回傳隨機數生成器的狀態:
rand_state = random.getstate()
並在下次調用random模組前設定下相同的狀態,便可以得到相同的隨機結果:
random.setstate(rand_state)
以下範例展示利用設定相同的種子,在每個for迴圈中都產生同樣的亂數:
# import random module
import random # random seed
for i in range(5): random.seed(1) rand_int = random.randint(1, 10) print(f"loop {i}: {rand_int}")
執行結果:
loop 0: 3
loop 1: 3
loop 2: 3
loop 3: 3
loop 4: 3
以下範例則是random.getstate()與setstate()的用法,
# save current state of the generator
rand_state = random.getstate() # generate random integer
rand_int = random.randint(1, 10)
print(f"Generate a random integer: {rand_int}") # generate another random integer
rand_int = random.randint(1, 10)
print(f"Generate another random integer: {rand_int}") # generate random integer after restoring random state
random.setstate(rand_state)
rand_int = random.randint(1, 10)
print(f"Generate a random integer after restoring state: {rand_int}")
執行結果:
Generate a random integer: 10
Generate another random integer: 2
Generate a random integer after restoring state: 10
程式範例