目錄
2.1.1:設置隨機種子: random.seed(a=None, version=2)
random是Python中與隨機數相關的模塊,其本質就是一個僞隨機數生成器,我們可以利用random模塊基礎生成各種不同的隨機數,以及一些基於隨機數的操作。
1:獲取模塊幫助文檔
# encoding=gbk
import 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))
"""
輸出:
329
724
674
2496
4437
********************
329
724
674
2496
4437
"""
2.2 隨機整數
import random
# 返回一個不大於K位的Python整數(十進制),比如k=10,則結果是0~2^10之間的整數。
k = 10
print(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) # 返回值爲None
print(a) # 隨機的
3:生成隨機字符串
# encoding=gbk
import 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 < 4:
length = 4
result = ''
one_lower = [random.choice(string.ascii_lowercase)]
one_upper = [random.choice(string.ascii_uppercase)]
one_numeric = [random.choice(string.digits)]
all_chars = one_lower
all_chars += one_upper
all_chars += one_numeric
length = length - 3
all_chars += [random.choice(string.ascii_letters + string.digits) for i in range(length)]
# 洗牌,打亂順序
random.shuffle(all_chars)
# 生成最終字符串
result = ''.join([i for i in all_chars])
return result
# 1:最少8位
# 2:最少包括一位大寫字母,小寫字母,數字,特殊字符。
def genRandomString(length):
if length < 8:
length = 8
result = ''
one_lower = [random.choice(string.ascii_lowercase)]
one_upper = [random.choice(string.ascii_uppercase)]
one_numeric = [random.choice(string.digits)]
one_punctuation = [random.choice(string.punctuation)]
all_chars = one_lower
all_chars += one_upper
all_chars += one_numeric
all_chars += one_punctuation
length = length - 4
all_chars += [random.choice(string.ascii_letters + string.digits + string.punctuation) for i in range(length)]
# 洗牌,打亂順序
random.shuffle(all_chars)
# 生成最終字符串
result = ''.join([i for i in all_chars])
return result
if __name__ == '__main__':
print(verificationCode(4))
print(genRandomString(8))