random – 產生偽隨機亂數
This module implements pseudo-random number generators for various distributions.
官方介紹文件:9.6. random — Generate pseudo-random numbers
如果要產生亂數密碼或是 token,請使用 secrets 模組,絕對不要使用 random 模組來產生密碼。
亂數狀態相關
01. random.seed(a=None, version=2)
random.seed() 初始化亂數種子。a
如果是 None 則使用目前的亂數種子。a
可以是 str
, bytes
, bytearray
, 都會被轉型成 int
。
02. random.getstate()
random.getstate() 取得亂數器內部狀態。
03. random.setstate(state)
random.setstate() 設定亂數器內部狀態,state
需為 random.getstate() 獲得之 state。
使用範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> import random >>> random.seed(‘foobar’) # 設定 random seed >>> random.randint(0, 100) # 隨意消耗一些亂數 32 >>> random.randint(0, 100) 31 >>> random.randint(0, 100) 44 >>> rs = random.getstate() # 儲存目前的亂數狀態 >>> r0 = [random.randint(0, 100) for _ in range(10)] # 生成 10 個亂數 >>> random.setstate(rs) # 回復亂數狀態 >>> r1 = [random.randint(0, 100) for _ in range(10)] # 生成 10 個亂數 >>> r0 == r1 # r0, r1 亂數應該相同 True |
整數亂數產生
01. random.randrange(stop) / random.randrange(start, stop[, step])
回傳一個 range(start, stop, step)
之中的數值。類似於 choice(range(start, stop, step))
,可是不會真的做出一個 range object。
02. random.randint(a, b)
回傳一個整數 N (a <= N <= b)。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> import random >>> random.seed(‘foobar’) >>> random.randint(0, 10) 4 >>> random.randrange(0, 10, 3) # range(0, 10, 3) -> [0, 3, 6, 9] 3 >>> random.randrange(0, 10, 3) 6 >>> random.randrange(0, 10, 3) 3 >>> rnds = [random.randint(0, 10) for _ in range(10)] >>> rnds [8, 3, 0, 0, 7, 0, 9, 9, 6, 7] |
序列操作相關
01. random.choice(seq)
從 seq
之中回傳一個元素。如果 seq 是空的,會回傳 IndexError。
02. random.choices(population, weights=None, *, cum_weights=None, k=1)
所有動物一律平等,但一些動物比其他動物更加平等。
回傳從 population
中選取 k 個元素。可以設定 weights
或是 cum_weights
來改變元素的權重。weights [10, 5, 13, 27]
跟 cum_weights [10, 15, 28, 55]
是相同的。此為重置抽樣 (sampling with replacement)。
03. random.shuffle(x[, random])
亂數洗掉 x
中的順序。random
參數可以放入 [0.0, 1.0) 的浮點數。
04. random.sample(population, k)
回傳長度為 k
且元素唯一的 list。此為非重置抽樣 (sampling without replacement)。
重置抽樣、非重置抽樣
- Sampling with replacement: 從總體抽出一個元素後,會將該元素放回總體。接著重新抽取,因此有機會抽取到相同的元素。
- Sampling without replacement: 從總體抽出一個元素後,不會將該元素放回總體。因此不會在次抽到已抽到的元素。
使用範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> import random >>> random.seed(‘foobar’) >>> seq = [1, 2, 3, 4, 5] >>> ranodm.choice(seq) 3 >>> random.choices(seq, k=3) # 重置抽樣,有機會抽到相同的元素 [2, 5] >>> random.choices(seq, k=3) [5, 5, 4] >>> random.sample(seq, k=3) # 非重置抽樣,不會抽到相同的元素 [2, 1, 4] >>> random.sample(seq, k=3) [4, 1, 3] >>> random.shuffle(seq) # 亂數重整 seq 順序 >>> seq [1, 3, 2, 4, 5] |
Leave a Reply