Categories: Python

Python 以 random 模組產生隨機亂數教學與範例

介紹如何使用 Python 內建的 random 模組產生各種亂數,以及進行隨機抽樣或排序等。

Python 內建的 random 模組可以用來產生隨機亂數,以下是各種亂數的產生方式與範例。

若要使用 Python 的 random 模組,直接引入即可,不必安裝:

# 引入 random 模組
import random

產生隨機亂數(浮點數)

random 函數可以產生介於 01 之間隨機浮點數:

# 產生介於 0 到 1 之間的隨機浮點數(0.0 <= x < 1.0)
x = random.random()
print(x)
0.20380693821340268

若要改變隨機浮點數的數值範圍,可以使用 uniform 函數,它可以透過參數指定亂數的下限與上限值:

# 產生介於 2.5 到 10 之間的隨機浮點數(2.5 <= x < 10.0)
x = random.uniform(2.5, 10.0)
print(x)
7.662203326329259

產生隨機亂數(整數)

若要產生固定範圍內的隨機整數,可以使用 randrange,其範圍的指定方式類似 range,可以用單一參數指定範圍上限值,下限值預設為 0。例如產生介於 04 之間的隨機整數:

# 產生介於 0 到 4 的隨機整數(0 <= x < 5)
x = random.randrange(5)
print(x)
3

當下限值不是 0 的時候,則可用兩個參數分別指定上限與下限值,例如產生介於 59 的隨機整數:

# 產生介於 5 到 9 的隨機整數(5 <= x < 10)
x = random.randrange(5, 10)
print(x)
8

randrange 可以透過第三個參數指定步長(step),可用於產生奇數或偶數等亂數:

# 產生介於 0 到 100 的隨機偶數(0 <= x < 101)
x = random.randrange(0, 101, 2)
print(x)
12

設定亂數種子

電腦所產生的亂數實際上是根據亂數種子與演算法計算出來的,同樣的亂數種子會產生相同的亂數。若要設定亂數種子可以使用 seed 函數:

# 設定亂數種子
random.seed(10)

# 產生亂數
print(random.random())
0.5714025946899135

亂數種子在驗證程式的正確性時非常重要,在程式的開發與除錯階段,通常都需要固定亂數種子,這樣才能比較容易看出程式有沒有問題。

隨機抽取串列元素

如果要從一個串列(list)中隨機抽取一個元素(隨機抽樣),可以使用 choice 函數:

# 串列資料
a = ["A", "B", "C", "D"]

# 隨機抽取一個元素
x = random.choice(a)
print(x)
B

如果要抽取多個元素,而且取後不放回,則可使用 sample 函數:

# 串列資料
a = ["A", "B", "C", "D"]

# 隨機抽取 2 個元素(取後不放回)
x = random.sample(a, 2)
print(x)
['D', 'C']

如果要抽取多個元素,並且取後放回,則可使用 choices 函數:

# 串列資料
a = ["A", "B", "C", "D"]

# 隨機抽取 2 個元素(取後放回)
x = random.choices(a, k=2)
print(x)
['D', 'B']

隨機排序串列

若要對串列進行隨機排序,把元素的順序打亂,可以使用 shuffle 函數:

# 串列資料
a = [1, 2, 3, 4, 5, 6]

# 隨機排序串列
random.shuffle(a)
print(a)

產生常態分布亂數

常態分布(normal distribution,又稱高斯分布)是模擬分析上很常被使用分布之一,若要產生常態分布的亂數可以使用 gauss 函數:

# 產生常態分布亂數(平均值 = 0,標準差 = 1)
x = random.gauss(mu=0, sigma=1)
print(x)
0.49899782617786265

以下是產生 10000 個常態分布亂數,並繪製直方圖的範例:

import random
import matplotlib.pyplot as plt

# 產生 10000 個常態分布亂數
nums = []
for i in range(10000):
    x = random.gauss(mu=0, sigma=1)
    nums.append(x)

# 繪製直方圖
plt.hist(nums, bins=100)
plt.show()
常態分布亂數直方圖

產生指數分布亂數

指數分布(exponential distribution)也是常見的分布之一,若要產生指數分布的隨機亂數,可以使用 函數:

# 產生指數分布亂數(平均值 = 1/5)
x = random.expovariate(lambd=5)
print(x)
0.15457600767292332

以下是產生 10000 個指數分布亂數,並繪製直方圖的範例:

import random
import matplotlib.pyplot as plt

# 產生 10000 個指數分布亂數
nums = []
for i in range(10000):
    x = random.expovariate(lambd=5)
    nums.append(x)

# 繪製直方圖
plt.hist(nums, bins=100)
plt.show()
指數分布亂數直方圖

其他分布亂數

random 模組還可以產生其他不同分布的隨機亂數,對應的函數如下:

詳細的說明可參考 random 模組的官方說明文件

參考資料:

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago