天天看點

#擡擡小手學Python# 内置 random 子產品【附源碼】

Python 内置子產品之 random

======================

random 庫是 Python 中生成随機數的标準庫,包含的函數清單如下:

  • 基本随機函數:

    seed

    random

    getstate

    setstate

  • 擴充随機函數:

    randint

    getrandbits

    randrange

    choice

    shuffle

    sample

  • 分布随機函數:

    uniform

    triangular

    betavariate

    expovariate

    gammavariate

    gauss

    lognormvariate

    normalvariate

    vonmisesvariate

    paretovariate

    weibullvariate

    。undefined發現單詞

    variate

    出現頻率比較高,該但是是變量的意思。

基本随機函數

seed 與 random 函數

seed 函數初始化一個随機種子,預設是目前系統時間。

random 函數 生成一個 [0.0,1.0) 之間的随機小數 。

具體代碼如下:

import random

random.seed(10)

x = random.random()
print(x)           

複制

其中需要說明的是

random.seed

函數, 通過 seed 函數 可以每次生成相同的随機數,例如下述代碼:

import random

random.seed(10)
x = random.random()
print(x)

random.seed(10)
y = random.random()
print(y)           

複制

在不同的代碼上擷取到的值是不同的,但是 x 與 y 是相同的。

0.5714025946899135
0.5714025946899135           

複制

12.1.2 getstate() 和 setstate(state)

getstate

函數用來記錄随機數生成器的狀态,

setstate

函數用來将生成器恢複到上次記錄的狀态。

# 記錄生成器的狀态
state_tuple = random.getstate()
for i in range(4):
    print(random.random())
print("*"*10)
# 傳入參數後恢複之前狀态
random.setstate(state_tuple)
for j in range(4):
    print(random.random())           

複制

輸出的随機數兩次一緻。

0.10043296140791758
0.6183668665504062
0.6964328590693109
0.6702494141830372
**********
0.10043296140791758
0.6183668665504062
0.6964328590693109
0.6702494141830372           

複制

擴充随機函數

random 擴充随機函數有如下幾個:

randint`、`getrandbits`、`randrange`、`choice`、`shuffle`、`sample           

複制

randint 和 randrange

randint

生成一個

[x,y]

區間之内的整數。

randrange

生成一個

[m,n)

區間之内以

k

為步長的随機整數。

測試代碼如下:

x = random.randint(1,10)
print(x)

y = random.randrange(1,10,2)
print(y)           

複制

這兩個函數比較簡單,

randint

函數原型如下:

random.randint(start,stop)           

複制

參數

start

表示最小值,參數

stop

表示最大值,兩頭都是閉區間,也就是

start

stop

都能被擷取到。

randrange

函數原型如下:

random.randrange(start,stop,step)           

複制

如果函數調用時隻有一個參數,預設是從 0 到該參數值,該函數與

randint

差別在于,函數是左閉右開,最後一個參數是步長。

查閱效果,可以複制下述代碼運作:

for i in range(3):
    print("*"*20)
    print(random.randrange(10))
    print(random.randrange(5,10))
    print(random.randrange(5,100,5))           

複制

getrandbits(k) 和 choice(seq)

getrandbits

生成一個 k 比特長的随機整數,實際輸出的是 k 位二進制數轉換成的十進制數。

choice

從序列中随機選擇一個元素。

x =  random.getrandbits(5)
print(x)
# 生成的長度是 00000-11111           

複制

getrandbits(k)

函數可以簡單描述如下:輸出一個 $[0,2^k-1]$ 範圍内一個随機整數,

k

表示的是 2 進制的位數。

choice

就比較簡單了,從清單中傳回一個随機元素。

import random

my_list = ["a", "b", "c"]

print(random.choice(my_list))           

複制

shuffle(seq) 和 sample(pop,k)

shuffle

函數用于将序列中的元素随機排序,并且原序列被修改。

sample

函數用于從序列或者集合中随機選擇 k 個選擇,原序列不變。

my_list = [1,2,3,4,5,6,7,8,9]
random.shuffle(my_list)

print(my_list)           

複制

shuffle

函數隻能用于可變序列,不可變序列(如元組)會出現錯誤。

my_list = ["夢想", "橡皮擦", 1, 2, [3, 4]]
print(my_list)
ls = random.sample(my_list, 4)
print(ls)           

複制

分布随機函數

該部分涉及的比較多,重點展示重要和常見的一些函數。

uniform(a,b) 、betavariate 和 triangular 函數

uniform

生成一個

[a,b]

之間的随機小數,采用等機率分布。

betavariate

生成一個

[0,1]

之間的随機小數,采用

beta

分布。

triangular

生成一個

[low,high]

之間的随機小數,采用三角分布。

在使用

uniform

時候需要注意,如果 a<b,那麼生成一個 b-a 之間的小數。

for i in range(3):
    print(random.uniform(4, 1))           

複制

其它分布随機函數

以下都是生成随機數的方法,隻是底層核心算法不同。

、、、、、、、。

  1. expovariate

    :生成一個

    (0,∞)

    之間的随機整數,指數分布;
  2. gammavariate

    :采用 gamma 分布;
  3. gauss

    :采用高斯(正太)分布;
  4. lognormvariate

    :對數正太分布;
  5. normalvariate

    :正太分布;
  6. vonmisesvariate

    :馮米賽斯分布;
  7. paretovariate

    :帕累托分布;
  8. weibullvariate

    :韋伯分布。

這篇部落格的總結

本篇部落格學習了 Python 中随機數相關的知識點,希望對你有所幫助。