python-random模組詳解
0.摘要
本文主要介紹random模組的各種方法,並用python3做功能展示。
1.random.random()
產生一個位於[0,1)區間的隨機數。
random.random() #產生一個[0,1)的數
10 * random.random() #產生一個[0,10)的數
2.random.uniform(a,b)
這個方法的官方解釋很高深,理解不了:
uniform(a, b) method of random.Random instance
Get a random number in the range [a, b) or [a, b] depending on rounding.
右區間的開閉取決於四捨五入,怎麼個四捨五入呢?找到一個看似正確的解釋,供和我一樣迷惑的讀者參考吧。
https://stackoverflow.com/questions/13213496/what-does-depending-on-rounding-exactly-mean
a = random.uniform(1.23,4.56) #產生一個位於1.23~4.56範圍內的隨機數
b = random.uniform(1.5,-10) #產生一個位於-10~1.5範圍內的隨機數
我自己的直觀理解,就是random.uniform(a,b),得到的是一個位於a,b之間的隨機數(暫且不討論區間開閉問題),
並且,a > b,a =b,a<b都可以。
3.random.randint(a,b)
生成一個位於[a,b]的隨機整數。a<=b 。注意,兩邊都是閉區間。
r = random.randint(-100,100) #產生一個位於[-100,100]區間內的整數
4.random.randrange(start,stop,step)
生成一個位於[start,stop)的隨機整數,注意,start,stop,step都必須是整數,step為可選引數,預設步長為1。
這個函式主要是為了彌補randint方法的不足,因為randint隨機數生成區間兩邊都是閉區間,這在python中是不友好的。
並且,start 可以小於 stop(步長需要為負數)。
r = random.randrange(1,100) #產生一個在[1,100)之間的整數
r = random.randrange(100,0,-2) #從(0,100]區間中,隨機取一個偶數
5.random.sample(population, k)
從population取k個不重複的元素,並存放到列表中,原始資料population保持不變。
population可以是列表、元組、集合。
a = range(100)
b = set(a)
print(random.sample(a,10)) #從列表a中隨機取10個元素
print(random.sample(b,10)) #從集合b中隨機取10個元素
6.random.choice(seq)
從非空列表中隨機選取一個元素。
seq可以是列表、元組。
a = range(100)
b = tuple(a)
print(random.choice(a)) # 從列表a中隨機選取一個元素
print(random.choice(b)) # 從元組b中隨機選取一個元素
7.random.shuffle(x, random=None)
將x隨機打亂,並替換現有的x。該函式沒有返回值。
這裡說一下random引數:這個引數通常不使用,它要求是一個函式,該函式無引數,能夠返回 [0.0, 1.0)的隨機值。如果random=None,則random=random.random.
a = list(range(10))
print(a)
random.shuffle(a)
print(a)
執行上述程式,我們會發現執行random.shuffle前後的兩個a不同了,後者被隨即打亂。
這裡再舉一個random引數的例子,不再詳細說明:
import random
import numpy as np
a = list(range(10))
random.shuffle(a,np.random.random)
print(a)
8.random.seed(x)
random.seed(x)用於設定隨機函式的初始狀態,如果x相同,那麼兩次random操作,得到的結果就是相同的。
x是實數,可以是整數,也可以是浮點數,可以使正數,也可以是負數或0。
import random
a = random.random()
b = random.random()
print(a,b)
random.seed(0)
a = random.random()
random.seed(0)
b = random.random()
print(a,b)
從結果上看,第一次a,b是不同的,第二次的a,b是相同的。
注意:random.seed()作用效果只有一次:
import random
random.seed(1)
for _ in range(10):
print(random.randint(1,10),end=' ')
print()
print('==================================')
for _ in range(10):
random.seed(1)
print(random.randint(1, 10),end=' ')
由於第二次random.seed()寫在了for迴圈中,所以輸出的都是3.