天天看點

Python學習筆記 random 子產品

目錄

  - 簡述

  - 常用方法及解析

  - 小栗子

簡述

  random 子產品實作了各種分布的僞随機數生成器,利用這些僞随機數生成器,我們可以得到僞随機的數或者序列。

  可以通過屬性 random.__all __ 來擷取子產品内所有公開的函數。random 子產品幾乎所有函數都依賴于基本函數 random() ,它在半開放區間 [0.0,1.0) 内均勻地生成随機浮點數。 Python 使用 Mersenne Twister 作為核心生成器,它産生 53 位精度浮點數,周期為 219937-1 ,其在 C 的底層實作,既快又線程安全。 Mersenne Twister 是現存測試最廣泛的随機數發生器之一。 但是,因為它的完全确定性,它不适用于所有工作,且完全不适合加密工作。

  random 子產品提供的函數其實是 random.Random 類的隐藏執行個體的綁定方法,該隐藏執行個體名為 _inst ,它在 random 導入時被建立,并将其方法導出為子產品級函數,這些函數在使用者代碼和 Python 庫中共享狀态。如果你想擷取不共享狀态的生成器,可以通過執行個體化 random.Random 來實作。

  除了 Random 類,random 子產品還提供了 SystemRandom 類,它使用系統函數 os.urandom() 從作業系統提供的源中生成随機數。這并非适用于所有系統, 也不依賴于軟體狀态,序列不可重制。

  下面介紹 random 子產品中常用的函數

常用方法及解析

常用的方法

random.random()
        功能:傳回 [0.0, 1.0) 區間内的一個僞随機浮點數
        參數:無
        傳回值:一個浮點數

    uniform(a, b)
        功能:傳回 [a, b] 或 [a, b)區間(這取決于a+(b-a)*random()中的浮點舍入)内的一個僞随機浮點數
        參數:a, b可以是整數也可以是浮點數,a 也可以大于 b,其中小的為起點,大的為終點
        傳回值:一個浮點數

    randint(a, b)
        功能:傳回 [a, b] 區間内的一個随機整數
        參數:a 和 b 為兩個整數,且 a<=b
        傳回值:一個整數

    choice(seq)
        功能:從非空序列 seq 傳回一個随機元素
        參數:seq 為非空序列
        傳回值:seq 中的一個元素

    choices(population, weights=None, cum_weights=None, k=1)
        功能:從 population 中選擇,傳回長度為 k 的清單
        參數:population 表示一個序列,weights 表示相對權重,cum_weights 表示累計權重,k 表示從 population 中選出元素(可重複)的個數
        傳回值:一個長度為 k 的清單
        
        說明:如果指定了 weight 序列,則根據相對權重進行選擇。 或者,如果給出 cum_weights 序列,則根據累積權重進行選擇。
        例如,相對權重``[10, 5, 30, 5]``相當于累積權重``[10, 15, 45, 50]``。 
        在内部,相對權重在進行選擇之前會轉換為累積權重,是以提供累積權重可以節省工作量。
        如果既未指定 weight 也未指定 cum_weights ,則以相等的機率進行選擇。 如果提供了權重序列,則它必須與 population 序列的長度相同。

        此處應有個例子:
        """
        	import random
            li = [1, 2]
            print(random.choices(population=li, cum_weights=[2, 10], k=10))
            # [2, 2, 1, 1, 2, 2, 1, 1, 2, 2]
            # 每次輸出結果基本都不一樣,但明顯可以看出 2 的個數要比 1 多
		"""
		
    randrange(start, stop[, step])
        功能:從開始為 start,結束為 stop,步長為 step 的序列中随即傳回一個元素
        參數:start 表示起點,stop 表示終點,step 表示步長,步長可選
        傳回值:[start, stop)序列中的一個元素
        說明:該函數相當于  choice(range(start, stop, step)) ,但實際上并沒有建構一個 range 對象。

    shuffle(x[, random])
        功能:将序列 x 随機排序
        參數:x 表示一個可變序列,random 表示一個 0 參函數,在 [0.0, 1.0) 中傳回随機浮點數;預設情況下,這是函數 random()
        傳回值:None

    sample(population, k)
        功能:傳回從給定序列或集合中選擇的唯一進制素的長度為 k 的清單。 用于無重複的随機抽樣
        參數:population 表示給定的序列或集合,k 表示傳回清單的長度
        傳回值:傳回包含來自 population 元素的新清單,同時保持 population 不變
        
        說明:要從一系列整數中選擇樣本,請使用 range() 對象作為參數。 因為對于大量資料來說,這種方法特别快且節省空間

    seed(a=None, version=2)
        功能:指定種子來初始化僞随機數生成器。
        參數:a 表示随機數種子,若為 None,則預設為是目前的系統時間,version 表示版本号
        傳回值:None
        
        說明:a 可以是 int,若為 str 、 bytes 或 bytearray 則轉換為 int 并使用它的所有位(對于版本 2)

    getstate()
        功能:擷取生成器目前内部狀态的對象,這個對象可以傳遞給 setstate() 來恢複狀态
        參數:無
        傳回值:一個三元組,表示生成器的内部狀态

    setstate(state)
        功能:從 getstate() 傳回的對象中恢複内部狀态
        參數:state 應該是 getstate() 的傳回對象
        傳回值:None

    getrandbits(k)
        功能:生成具有 k個随機位的 int
        參數:表示生成的随機數的二進制位數
        傳回值:一個整數
           

一些數學分布(不做詳細介紹)

vonmisesvariatee(mu, kappa)
        normalvariate(mu, sigma):正态分布
        lognormvariate(mu, sigma):對數正态分布
        expovariate(lambd):指數分布
        gammavariate(alpha, beta):伽瑪分布
        triangular(low, high, mode):對稱分布
        gauss(mu, sigma):高斯分布
        betavariate(alpha, beta):貝塔分布
        paretovariate(alpha):帕累托分布
        weibullvariate(alpha, beta):威布爾分布
           

小栗子

随機生成驗證碼的小栗子

import random


def my_test(n):
    password = ''
    for i in range(n):
        s1 = chr(random.randint(65, 90))
        s2 = str(random.randint(0, 9))
        password += random.choice([s1, s2])
    return password


print(my_test(6))