random是Python中與隨機數相關的模塊,其本質就是一個偽隨機數生成器,我們可以利用random模塊基礎生成各種不同的隨機數,以及一些基於隨機數的操作。
1:獲取模塊幫助文檔
# encoding=gbkimport random print(random.__doc__) print(dir(random)) for item in dir(random): print(item) print(help(random.random))print(help(random.randrange))print(help(random.randint))
2:random模塊方法
2.1 基本方法
2.1.1:設置隨機種子: random.seed(a=None, version=2)
初始化隨機數生成器。如果未提供a或者a=None,則使用系統時間為種子。如果a是一個整數,則作為新的種子。如果a的值一樣,每次運行的產生的隨機數都是一樣的。
import random random.seed(100)print(random.randint(1,1000))print(random.randint(1,1000))print(random.randint(1,1000))print(random.randint(1,10000)) """每次運行,產生的值都是一樣的"""
2.1.2:獲取及設置生成器的內部狀態
獲取狀態:
state = random.getstate()
設置狀態:
random.setstate(state)
這個有什麼用呢?在狀態一樣的情況下,生成的隨機數是一樣的,如下例子:
import random # 保存內部狀態state = random.getstate() print(random.randint(1,1000))print(random.randint(1,1000))print(random.randint(1,1000))print(random.randint(1,10000))print(random.randint(1,10000)) print('*'*20)# 重置內部狀態,後面產生的隨機數將會與保存state狀態的地方產生的隨機數一樣(當然是隨機範圍一樣的情況下)random.setstate(state)print(random.randint(1,1000))print(random.randint(1,1000))print(random.randint(1,1000))print(random.randint(1,10000))print(random.randint(1,10000)) """輸出:32972467424964437********************32972467424964437"""
2.2 隨機整數
import random # 返回一個不大於K位的Python整數(十進位),比如k=10,則結果是0~2^10之間的整數。k = 10print(random.getrandbits(k)) # random.randrange(start, stop[, step])print(random.randrange(10)) # [0,10),0---9 print(random.randrange(1, 10,2)) # [1,10) ,1---9 中的奇數 # random.randint(a, b)print(random.randint(1, 10)) # [1,10] 1---10 之間的整數
2.3 隨機浮點數
import random# [0, 1)print(random.random()) # uniform(a, b):[a, b) or [a, b] depending on rounding; 四捨五入print(random.uniform(10.25,100.25))
2.4 從序列中隨機獲取元素
import random # 1:# 從非空序列seq中隨機選取一個元素。如果seq為空則彈出IndexError異常。# choice(seq) seq = [1,2,3,4,5,6,7,8,11]print(random.choice(seq)) # 2:# 3.6版本新增。從population集群中隨機抽取K次元素。weights是相對權重列表(即可以轉換為概率),cum_weights是累計權重,兩個參數不能同時存在。# choices(population, weights=None, *, cum_weights=None, k=1)a = [1,2,3,4,5]# 在a中取5次元素,每次都從原序列中取,print(random.choices(a,k=5)) # 在a中取5次元素,每次都從原序列中取,並按照相對權重來取(可以理解按照概率(權重/累計權重)來取),下面輸出中:第三個元素的概率是100%print(random.choices(a,weights=[0,0,1,0,0],k=5))# 在a中取5次元素,每次都從原序列中取,並按照相對權重來取(可以理解按照概率來取);下面輸出中,每個元素取到的概率都是一樣的print(random.choices(a,weights=[1,1,1,1,1],k=5))# cum_weights是累計權重,如:weights=[1,2,3,4,5] 對應的cum_weights為cum_weights=[1,3,6,10,15],# 那麼 cum_weights=[1,1,1,1,1] 對應的weights為: weights=[1,0,0,0,0],即第一元素取到的概率為100%print(random.choices(a,cum_weights=[1,1,1,1,1],k=5)) """結果:[3, 4, 2, 2, 3] --- 隨機的[3, 3, 3, 3, 3] --- 每次都是3[5, 4, 4, 4, 5] --- 隨機的[1, 1, 1, 1, 1] --- 每次都是1""" # 3:# 從population樣本或集合中隨機抽取K個不重複的元素形成新的序列。常用於不重複的隨機抽樣。返回的是一個新的序列,不會破壞原有序列。比如從一個整數區間隨機抽取一定數量的整數random.sample(range(10000000), k=60),這非常有效和節省空間。如果k大於population的長度,則彈出ValueError異常。a = [1,2,3,4,5]# 在a中取3次元素,上次取完之後,下次在剩下的元素中取;(注意與random.choices的區別:random.choices是取一次之後,還會在原序列所有元素中取)# sample(population, k) print(random.sample(a, 3)) # [4, 5, 1] 隨機的 # 4:# 隨機打亂序列x內元素的排列順序,俗稱「洗牌」。只能用於可變的序列,對於不可變序列。# shuffle(x, random=None)a = [1,2,3,4,5]# 把a的順序打亂random.shuffle(a) # 返回值為Noneprint(a) # 隨機的
3:生成隨機字符串
# encoding=gbkimport random, string # string 模塊中:# ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'# ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'# ascii_letters = ascii_lowercase + ascii_uppercase# digits = '0123456789'# hexdigits = digits + 'abcdef' + 'ABCDEF'# octdigits = '01234567'# punctuation = r"""!"#$%&'()*+,-./:;?@[\]^_`{|}~""" # 1:最少4位# 2:最少包括一位大寫字母,小寫字母,數字。def verificationCode(length): if length