閱讀本文需要3.5分鐘
關于在Python中處理随機性的概述,隻使用标準庫和CPython本身中内置的功能。
在0.0和1.0之間生成随機浮點數
這個random.random()函數在間隔[0.0,1.0]中傳回一個随機浮點。這意味着傳回的随機數總是小于右端點(1.0).這也被稱為半開放範圍:>>> import random
>>> random.random()
0.11981376476232541
>>> random.random()
0.757859420322092
>>> random.random()
0.7384012347073081
在x和y
這是如何在Python中的兩個端點之間生成一個随機整數的方法。random.randint()功能。這跨越了整個[x,y]間隔,可能包括兩個端點:>>> import random
>>> random.randint(1, 10)
10
>>> random.randint(1, 10)
3
>>> random.randint(1, 10)
7
帶着random.randrange()函數可以排除間隔的右側,這意味着生成的數字總是位于[x,y]内,并且它總是小于右側的端點:>>> import random
>>> random.randrange(1, 10)
5
>>> random.randrange(1, 10)
3
>>> random.randrange(1, 10)
4
産生随機浮動x和y
如果需要生成位于特定[x,y]間隔内的随機浮點數,則可以使用random.uniform:>>> import random
>>> random.uniform(1, 10)
7.850184644194309
>>> random.uniform(1, 10)
4.00388600011348
>>> random.uniform(1, 10)
6.888959882650279
從清單中選擇随機元素
要從非空序列(如清單或元組)中選擇一個随機元素,可以使用Python的random.choice:>>> import random
>>> items = ['one', 'two', 'three', 'four', 'five']
>>> random.choice(items)
'five'
>>> random.choice(items)
'one'
>>> random.choice(items)
'four'
這适用于任何非空序列,如果序列為空,則會出現異常。
随機化元素清單
可以使用random.shuffle。這将修改序列對象,并将元素的順序随機化:>>> import random
>>> items = ['one', 'two', 'three', 'four', 'five']
>>> random.shuffle(items)
>>> items
['four', 'one', 'five', 'three', 'two']
如果你不想修改原本的,你需要先複制一份,然後在随機。屬性建立Python對象的副本。copy子產品。
采摘n元素清單中的随機樣本
随機抽樣n序列中的唯一進制素,使用random.sample。它執行随機抽樣而不進行替換:>>> import random
>>> items = ['one', 'two', 'three', 'four', 'five']
>>> random.sample(items, 3)
['one', 'five', 'two']
>>> random.sample(items, 3)
['five', 'four', 'two']
>>> random.sample(items, 3)
['three', 'two', 'five']
生成密碼安全随機數
如果出于安全目的需要加密安全随機數,使用random.SystemRandom它使用加密安全的僞随機數生成器。
執行個體SystemRandom類的函數提供大多數随機數生成器操作。
下面是一個例子:>>> import random
>>> rand_gen = random.SystemRandom()
>>> rand_gen.random()
0.6112441459034399
>>> rand_gen.randint(1, 10)
2
>>> rand_gen.randrange(1, 10)
5
>>> rand_gen.uniform(1, 10)
8.42357365980016
>>> rand_gen.choice('abcdefghijklmn')
'j'
>>> items = ['one', 'two', 'three', 'four', 'five']
>>> rand_gen.shuffle(items)
>>> items
['two', 'four', 'three', 'one', 'five']
>>> rand_gen.sample('abcdefghijklmn', 3)
['g', 'e', 'c']
注意SystemRandom并不保證在所有運作Python的系統上都可用
Python 3.6+-secrets子產品:
如果您正在使用Python 3,并且你的目标是生成加密安全的随機數,那麼一定要檢查secrets子產品。這個子產品可以在Python3.6(及以上)标準庫中獲得。這使得安全令牌的生成變得很友善。
以下是幾個例子:>>> import secrets
# 生成安全令牌:
>>> secrets.token_bytes(16)
b'\xc4\xf4\xac\x9e\x07\xb2\xdc\x07\x87\xc8 \xdf\x17\x85^{'
>>> secrets.token_hex(16)
'a20f016e133a2517414e0faf3ce4328f'
>>> secrets.token_urlsafe(16)
'eEFup5t7vIsoehe6GZyM8Q'
# 從序列中随機選擇一個元素:
>>> secrets.choice('abcdefghij')
'h'
# Securely compare two strings for equality
# (Reduces the risk of timing attacks):
>>> secrets.compare_digest('abcdefghij', '123456789')
False
>>> secrets.compare_digest('123456789', '123456789')
True
您可以了解更多關于secrets子產品在Python 3文檔中.