[編程基礎] Python隨機數生成模塊總結

Python隨機數生成模塊教程演示如何在Python中生成僞隨機數。

1 介紹

1.1 隨機數字生成器

隨機數生成器(RNG)生成一組在外觀上不顯示任何可區分模式的值。隨機數生成器分爲兩類:硬件隨機數生成器和僞隨機數生成器。硬件隨機數生成器被認爲能產生真正的隨機數。僞隨機數生成器根據軟件算法生成值。它們產生的值看起來是隨機的。但這些值是確定性的,如果算法已知,可以重新生成。

在計算中,隨機生成器用於遊戲、模擬或密碼學。爲了安全起見,必須使用加密安全的僞隨機數生成器。爲了提高僞隨機數生成器的質量,操作系統使用從設備驅動程序、用戶輸入延遲或來自一個或多個硬件組件的抖動中收集的環境噪聲。這是加密安全僞隨機數生成器的核心。

1.2 Python random 模塊

內置的Python random模塊爲各種分佈實現僞隨機數生成器。Python使用Mersenne Twister算法來生成僞隨機數。這個模塊安全性不高。對於安全相關的任務,推薦使用secrets模塊。

1.3隨機種子

種子是初始化隨機數生成器的值。隨機數生成器通過對以前的值執行一些操作來生成值。當算法開始時,種子是生成器操作的初始值。生成器最重要和最困難的部分是提供接近真正隨機數的種子。要注意的是同一種子產生相同的僞隨機數集。

2 使用

2.1 Python random模塊同一隨機種子使用

在下面的示例中,我們使用相同的種子。相同的種子值產生相同的僞隨機值。

import random


myseed = 16

# 設置隨機種子
random.seed(myseed)

# 產生隨機數
print(random.random())
print(random.random())
print(random.random())

print('********************************')

random.seed(myseed)

print(random.random())
print(random.random())
print(random.random())
0.36152277491407514
0.480480665601294
0.4169526266056648
********************************
0.36152277491407514
0.480480665601294
0.4169526266056648

2.2 Python random.randint

random.randint函數在值[x,y]之間生成整數。以下示例生成數字1到10之間的四個隨機整數。

import random


val = random.randint(1, 10)
print(val)

val = random.randint(1, 10)
print(val)

val = random.randint(1, 10)
print(val)

val = random.randint(1, 10)
print(val)
5
6
3
10

2.3 Python random.randrange

random.randrange函數排除了右邊的區間。它選擇[x,y)之間的值。以下示例生成數字1到10之間的四個隨機整數,其中排除了值10。

import random


val = random.randrange(1, 10)
print(val)

val = random.randrange(1, 10)
print(val)

val = random.randrange(1, 10)
print(val)

val = random.randrange(1, 10)
print(val)
5
1
4
5

2.4 Python random.uniform

random.uniform函數在值[x,y]之間生成隨機浮點數。以下示例在數字1和10之間產生四個隨機浮點數。

import random


val = random.uniform(1, 10)
print(val)

val = random.uniform(1, 10)
print(val)

val = random.uniform(1, 10)
print(val)

val = random.uniform(1, 10)
print(val)
1.1833595562120247
2.3856384178156502
6.45443300907888
6.678603948997886

2.5 Python random.choice

該random.choice函數從非空序列返回一個隨機元素。該示例從列表中隨機抽取一個單詞四次。

import random


words = ['sky', 'storm', 'rock', 'falcon', 'forest']


val = random.choice(words)
print(val)

val = random.choice(words)
print(val)

val = random.choice(words)
print(val)

val = random.choice(words)
print(val)
falcon
falcon
forest
rock

2.6 Python random.shuffle

random.shuffle函數可以將序列打亂。以下示例將單詞列表隨機打亂兩次。

import random


words = ['sky', 'storm', 'rock', 'falcon', 'forest']


random.shuffle(words)
print(words)

random.shuffle(words)
print(words)
['sky', 'falcon', 'forest', 'rock', 'storm']
['storm', 'forest', 'falcon', 'sky', 'rock']

2.7 Python random.sample

random.sample允許從一個序列中隨機抽取n個唯一元素。以下示例從單詞列表中兩次隨機抽取三個元素。

import random


words = ['sky', 'storm', 'rock', 'falcon', 'forest']


sample = random.sample(words, 3)
print(sample)

sample = random.sample(words, 3)
print(sample)
['storm', 'rock', 'forest']
['rock', 'falcon', 'storm']

2.8 Python secrets 模塊

secrets模塊用於生成適合管理密碼、帳戶身份驗證或安全令牌等數據的強隨機數。sercets模塊中token_hex函數返回一個隨機的十六進制文本字符串。token_urlsafe函數返回一個url安全的隨機文本字符串。

import secrets
import string

# 返回一個隨機的十六進制文本字符串
print(secrets.token_hex(12))
# 返回隨機文本字符串
print(secrets.token_urlsafe(12))

# 生成一個八個字符的字母數字密碼
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

print(password)
49a4c25d535581c0e1edaf71
_FHy1al7lB4fyVqU
JjLoiy7k

2.9 Python UUID模塊

通用唯一標識符(Universally Unique Identifier)UUID是指一臺機器上生成的數字,UUID是128位的全局唯一標誌,通常由32字節的字符串表示。UUID由以下幾部分組成:

  • 時間戳uuid1():根據時間或時鐘序列生成字符串

  • 分佈式計算uuid2():根據分佈式計算環境DCE生成字符串

  • 機器識別號uuid3():根據MAC地址或者IP生成字符串,沒有網卡則通過其他方式生成。

  • 隨機數uuid4():自動隨機生成一組序列字符串

  • 散列值uuid5(): 基於名字和SAHI值

python中uuid模塊提供UUID類,UUID類中通過函數uuid1(), uuid3(), uuid4(), uuid5()來生成1, 3, 4, 5各個版本的UUID ( python中沒有uuid2()這個函數,但是UUID標識符中有該指示實現,原因uuid2和uuid1類似,所以uuid2極少使用)。

import uuid

name = "test"

print(uuid.uuid1())
print(uuid.uuid3(uuid.NAMESPACE_DNS, name))
print(uuid.uuid4())
print(uuid.uuid5(uuid.NAMESPACE_DNS, name))
62ecaf30-b61a-11ea-ac5b-0a58ac13091e
45a113ac-c7f2-30b0-90a5-a399ab912716
109e9212-e837-4cd9-9e21-3b48aba373fa
4be0643f-1d98-573b-97cd-ca98a65347dd

uuid1可保證生成全球範圍的唯一性字符. 但通過該方法生成的字符中包含有主機的網絡地址, 可能危及隱私,根據實驗的結果,產生的UUID後面幾段的數字會完全一樣。uuid4使用隨機數來生成UUID但是僞隨機數有較低的重複概率。uuid3和uuid5類似,都是通過計算命名空間和名字的SHA-1散列值來生成UUID。

在實際使用uuid1和uuid4較多,uuid3和uuid5更適合唯一性更高的場合。

3 參考

http://zetcode.com/python/random-module/

https://www.jianshu.com/p/f99737713c1b

https://www.cnblogs.com/iamjianghao/p/10764525.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章