使用Python random模塊生成隨機數據實例


本文轉載自https://freeaihub.com/article/use-random-module-to-generate-random-data-in-python.html
,本文中的案例均在該頁在線練習。

在本節中,我們將學習如何使用random模塊(random)在Python中生成隨機數和數據。該模塊為各種分布(包括整數,浮點數(實數))實現了偽隨機數生成器。

本文的目標:

以下是我們將在本文中介紹的常見操作的列表。

  • 為各種分布生成隨機數,包括整數和浮點數。
  • 隨機抽樣並從總體中選擇元素。
  • random模塊的功能。
  • 隨機播放序列數據。播種隨機生成器。
  • 生成隨機字符串和密碼。
  • 使用秘密模塊的加密安全隨機生成器。生成安全令牌,安全密鑰和URL
  • 如何設置隨機發生器的狀態。
  • 使用NumPy的random生成隨機數組。
  • 使用UUID模塊生成唯一ID

如何使用random模塊

random模塊具有各種功能來完成所有上述任務。我們將在本文的后半部分看到如何使用這些功能。

您需要在程序中導入random模塊,然后就可以使用該模塊了。使用以下語句將random模塊導入代碼中。

import random

現在讓我們看看如何使用random模塊。

import random
print("Printing random number using random.random()")
print(random.random())

如您所見,我們得到了0.50。您可能會得到其他號碼。

  • random()是random模塊的最基本功能
  • random模塊的幾乎所有功能都依賴於基本功能random()。
  • random() 返回范圍為[0.0,1.0)的下一個隨機浮點數。

random模塊功能

現在,讓我們看看random模塊中可用的不同功能及其用法。

random.randint(a,b)

使用random.randint()生成一定范圍內的隨機整數。讓我們看一下生成0到9之間的隨機數的示例。

import random
print("Random integer is", random.randint(0, 9))

random.randrange(start, stop [, step])

此函數從中返回隨機選擇的整數range(start, stop, step)。使用此函數可生成范圍內的隨機整數。例如, random.randrange(2, 20, 2)將返回2到20之間的任意隨機數,例如2、4、6,…18。

import random
print("Random integer is", random.randrange(2, 20, 2))

random.choice(seq)

使用該random.choice功能從列表或任何序列中隨機選擇一個項目。

import random
city_list = ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Philadelphia']
print("Random element from list:", random.choice(city_list))

random.sample(population, k)

要從列表或任何序列中隨機選擇多個元素時,請使用此功能。

import random
city_list = ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Philadelphia']
print("Pick 2 Random element from list:", random.sample(city_list, 2))

random.choices()

random.choices(population, weights=None, *, cum_weights=None, k=1)

如果要從序列中隨機選擇多個元素,請使用此方法。在Python 3.6版中引入的Choices方法可以重復元素。這是帶有替換的隨機樣本。

import random

#sampling with replacement
list = [20, 30, 40, 50 ,60, 70, 80, 90]
sampling = random.choices(list, k=5)
print("sampling with choices method ", sampling)

random.choices()主要用於實現加權隨機選擇,這樣我們就可以選擇不同的概率列表元素

random.seed(a=None, version=2)

seed函數用於初始化 Python中的偽隨機數生成器。random模塊使用種子值作為基礎來生成隨機數。如果不存在種子值,則需要系統當前時間。如果在調用任何random模塊函數之前使用相同的種子值,則每次都會獲得相同的輸出。

import random

# Random number with seed 6
random.seed(6)
print(random.randint(10, 20))

random.seed(6)
print(random.randint(10, 20))

random.shuffle(x [,random])

使用此功能可以隨機排列或隨機化列表或其他序列類型。該shuffle功能可就地隨機播放列表。最常見的例子是洗牌。

list = [2,5,8,9,12]
random.shuffle(list)
print ("Printing shuffled list ", list)

random.uniform(開始,結束)

使用random.uniform()生成一定范圍內的浮點數。

import random
print("floating point within given range")
print(random.uniform(10.5, 25.5))

random.triangular(低,高,模式)

random.triangular()函數返回一個隨機浮點數N,使得lower <= N <= upper 在這些邊界之間具有指定的模式。

下限的默認值為零,上限為1。此外,peak參數默認為邊界之間的中點,從而給出對稱分布。

使用該random.triangular()函數生成用於三角分布的隨機數,以在仿真中使用這些數。即從三角概率分布中產生值。

import random
print("floating point triangular")
print(random.triangular(10.5, 25.5, 5.5))

產生隨機字串

在本節中,我將讓您知道如何在python中生成固定長度的隨機字符串。

本指南包括以下內容:–

  • 隨機生成固定長度的字符串。
  • 獲取帶有字母和數字的隨機字母數字字符串。
  • 生成包含字母,數字和特殊符號的隨機密碼。

Python中的加密安全隨機生成器

由random模塊生成的隨機數和數據不是加密安全的。那么,如何生成在Python中具有加密安全性的隨機數呢?

密碼安全的偽隨機數生成器是一個隨機數生成器,它具有的 特性使其適合 在數據安全至關重要的密碼學應用使用

  • 所有加密安全的隨機生成器函數均返回隨機字節。
  • 此函數返回的隨機字節取決於操作系統的隨機源。隨機性的質量取決於操作系統的隨機性來源。

我們可以使用以下方法以加密方式保護Python中的隨機生成器

  • 秘密模塊以固定隨機數據
  • 使用操作系統。urandom()
  • 使用隨機。SystemRandom
import random
import secrets

number = random.SystemRandom().random()
print("secure number is ", number)

print("Secure byte token", secrets.token_bytes(16))

獲取並設置隨機發生器的狀態

random模塊具有兩個函數getstatesetstate,這有助於我們捕獲隨機發生器的當前內部狀態。使用此狀態,我們可以生成相同的隨機數或數據序列。

random.getstate()

getstate函數通過捕獲隨機生成器的當前內部狀態來返回對象。我們可以將此狀態傳遞給 setstate方法,以將該狀態恢復為當前狀態。

注意:通過將狀態更改為上一個狀態,我們可以再次獲得相同的隨機數據。例如,如果您想再次獲得相同的樣本項目,則可以使用這些功能。

random.setstate(狀態)

setstate() 函數將生成器的內部狀態恢復為狀態對象。即它再次應用相同的狀態。可以通過調用該getstate函數來獲取此狀態對象 。

為什么要使用getstate和setstate函數

如果獲得了先前的狀態並將其還原,則可以一次又一次地再現相同的隨機數據。請記住,您不能使用其他隨機函數,也不能更改參數值。這樣,您正在更改狀態。

現在讓我們看一下示例,以清楚地了解如何在Python中獲取和設置隨機生成器。

import random

number_list = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

print("First Sample is ", random.sample(number_list,k=5))

state = random.getstate()  # store this current state in state object
print("Second Sample is ", random.sample(number_list,k=5))

random.setstate(state)     # restore state now using setstate
print("Third Sample is ", random.sample(number_list,k=5)) #Now it will print the same second sample list

random.setstate(state)     # restore state now
print("Fourth Sample is ", random.sample(number_list,k=5)) #again it will print the same second sample list again

如您在輸出中看到的,由於重置了隨機生成器,我們得到了相同的樣本列表。

Numpy.random –數組的PRNG

PRNG是偽隨機數生成器的首字母縮寫。如您所知,使用Pythonrandom模塊,我們可以生成標量隨機數和數據。

  • 每當您要生成隨機數數組時,都需要使用numpy.random
  • numpy提供了numpy.random具有多種功能軟件包,可以為各種分布生成隨機的n維數組

現在,讓我們看一些例子。

生成一個隨機的n維浮點數數組

  • 使用numpy.random.rand()產生隨機浮點數的在范圍內的n維陣列[0.0,1.0)
  • 使用 numpy.random.uniform產生隨機浮點數的在[低的范圍內的n維陣列中,高)
import numpy
random_float_array = numpy.random.rand(2, 2)
print("2 X 2 random float array in [0.0, 1.0] \n", random_float_array,"\n")

random_float_array = numpy.random.uniform(25.5, 99.5, size=(3, 2))
print("3 X 2 random float array in range [25.5, 99.5] \n", random_float_array,"\n")

生成整數的隨機n維數組

使用 numpy.random.random_integers()生成隨機的n維整數數組。

import numpy

random_integer_array = numpy.random.random_integers(1, 10, 5)
print("1-dimensional random integer array \n", random_integer_array,"\n")

random_integer_array = numpy.random.random_integers(1, 10, size=(3, 2))
print("2-dimensional random integer array \n", random_integer_array)

從數字或序列數組中選擇隨機元素

  • 使用numpy.random.choice()生成隨機樣本。
  • 使用此方法可以從n維數組中獲取單個或多個隨機數,無論替換與否。

現在來看示例。

import numpy

array =[10, 20, 30, 40, 50, 20, 40]

single_random_choice = numpy.random.choice(array, size=1)
print("single random choice from 1-D array", single_random_choice)

multiple_random_choice = numpy.random.choice(array, size=3, replace=False)
print("multiple random choice from 1-D array without replacement ", multiple_random_choice)

multiple_random_choice = numpy.random.choice(array, size=3, replace=True)
print("multiple random choice from 1-D array with replacement ", multiple_random_choice)

我們將在后續文章中介紹其他numpy的隨機包函數及其用法。

生成隨機的通用唯一ID

Python UUID模塊提供了不變的UUID對象。 UUID是通用唯一標識符。

它具有生成所有版本的UUID的功能。使用 uuid.uuid4()函數,您可以生成128位長的隨機唯一ID廣告,這種廣告在 密碼學上是安全的。

這些唯一的ID用於標識計算機系統中的文檔,用戶,資源或任何信息。

范例

import uuid

# get a random UUID
safeId = uuid.uuid4()
print("safe unique id is ", safeId)

使用random模塊的骰子游戲

我創建了一個簡單的骰子游戲,以了解random模塊的功能。在這個游戲中,我們有兩個玩家和兩個骰子。

  • 每個玩家一個一個地洗牌,一個都洗牌。
  • 該算法計算兩個骰子數的總和,並將其添加到每個玩家的計分板上。
  • 得分高的玩家是贏家

程序

import random

PlayerOne = "Eric"
PlayerTwo = "Kelly"

EricScore = 0
KellyScore = 0

# each dice contains six numbers
diceOne = [1, 2, 3, 4, 5, 6]
diceTwo = [1, 2, 3, 4, 5, 6]

def playDiceGame():
    """#Both Eric and Kelly will roll both the dices using shuffle method"""

    for i in range(5):
        #shuffle both the dice 5 times
        random.shuffle(diceOne)
        random.shuffle(diceTwo)
    firstNumber = random.choice(diceOne) # use choice method to pick one number randomly
    SecondNumber = random.choice(diceTwo)
    return firstNumber + SecondNumber

print("Dice game using a random module\n")

#Let's play Dice game three times
for i in range(3):
    # let's do toss to determine who has the right to play first
    EricTossNumber = random.randint(1, 100) # generate random number from 1 to 100. including 100
    KellyTossNumber = random.randrange(1, 101, 1) # generate random number from 1 to 100. dosen't including 101

    if( EricTossNumber > KellyTossNumber):
        print("Eric won the toss")
        EricScore = playDiceGame()
        KellyScore = playDiceGame()
    else:
        print("Kelly won the toss")
        KellyScore = playDiceGame()
        EricScore = playDiceGame()

    if(EricScore > KellyScore):
        print ("Eric is winner of dice game. Eric's Score is:", EricScore, "Kelly's score is:", KellyScore, "\n")
    else:
        print("Kelly is winner of dice game. Kelly's Score is:", KellyScore, "Eric's score is:", EricScore, "\n")

后繼將會有更多文章使用實例方式介紹python的隨機模塊random和其它能幫助我們生成隨機數據的模塊。

來源:https://pynative.com/python-random-module
作者:pynative


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM