Python3中常用模塊-random模塊

目錄

1:獲取模塊幫助文檔

2:random模塊方法

2.1 基本方法

   2.1.1:設置隨機種子:  random.seed(a=None, version=2)  

2.1.2:獲取及設置生成器的內部狀態

2.3 隨機浮點數

2.4 從序列中隨機獲取元素

3:生成隨機字符串


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))

 

 

 

 

 

 

 

 

 

 

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