首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python random 模組完整教學:隨機數生成、選擇、洗牌與進階分佈

     編輯:更多程式設計知識

隨機數是模擬、遊戲、密碼學、測試、資料科學的核心基礎。Python random 模組提供豐富的偽隨機數生成器:整數、浮點數、序列選擇、洗牌、多種機率分佈。本文系統整理常用函式、最佳實務、種子控制、安全性考量與進階應用。

基礎匯入與核心函式


import random

# 1. 基礎隨機浮點數 [0.0, 1.0)
print(random.random())        # 0.123456789

# 2. 指定範圍浮點數 [a, b]
print(random.uniform(3, 8))   # 6.830376841

# 3. 指定範圍整數 [a, b] 含端點
print(random.randint(1, 4))   # 2

# 4. 範圍步長整數 [start, stop) step
print(random.randrange(10, 100, 2))  # 90(偶數)
# 等價於
print(random.choice(range(10, 100, 2)))

序列操作:選擇、取樣、洗牌


items = ['apple', 'banana', 'cherry', 'durian']
numbers = list(range(1, 11))  # [1..10]

# 1. 單一隨機選擇
print(random.choice(items))           # 'cherry'
print(random.choice(numbers))         # 7

# 2. 多重不重複取樣(不修改原序列)
sample = random.sample(numbers, 6)
print(sample)                         # [8, 9, 2, 1, 5, 4]
print(numbers)                        # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10](未變)

# 3. 原地洗牌(修改原列表)
random.shuffle(numbers)
print(numbers)                        # [10, 5, 2, 7, 3, 9, 4, 8, 6, 1]

# 4. 加權隨機選擇(Python 3.6+)
weights = [10, 1, 1, 1]  # apple 機率高
print(random.choices(items, weights=weights, k=3))  # 可能重複

種子控制:可重現性與測試


# 固定種子 → 固定序列
random.seed(10)
print(random.random())  # 0.57140259469
print(random.random())  # 0.42888905467

random.seed(10)         # 重置種子
print(random.random())  # 0.57140259469(相同序列)

# 最佳實務:測試用固定種子,生產環境用系統時間(預設)
# 避免全域狀態干擾:使用獨立 Random 實例
my_rng = random.Random(42)
print(my_rng.random())  # 不影響全域 random

進階機率分佈


# 1. 高斯/常態分佈 μ=0, σ=1
print(random.gauss(0, 1))      # -0.345...
print(random.normalvariate(0, 1))  # 同樣,執行緒安全

# 2. 指數分佈 λ=1.0
print(random.expovariate(1.0)) # 0.876...

# 3. 其他分佈(需 Python 3.6+)
# random.betavariate(alpha, beta)      # Beta 分佈
# random.gammavariate(alpha, beta)     # Gamma 分佈
# random.lognormvariate(mu, sigma)     # 對數常態
# random.vonmisesvariate(mu, kappa)    # Von Mises
# random.paretovariate(alpha)          # Pareto
# random.weibullvariate(alpha, beta)   # Weibull

實務應用場景

1. 簡易驗證碼生成


import string

def generate_captcha(length=6):
    chars = string.ascii_letters + string.digits
    return ''.join(random.choices(chars, k=length))

print(generate_captcha())  # aB3f9K

2. 隨機密碼生成(含符號)


def generate_password(length=12):
    chars = string.ascii_letters + string.digits + "!@#$%^&*"
    # 確保至少包含各類字元
    pwd = [
        random.choice(string.ascii_lowercase),
        random.choice(string.ascii_uppercase),
        random.choice(string.digits),
        random.choice("!@#$%^&*")
    ]
    pwd += random.choices(chars, k=length-4)
    random.shuffle(pwd)
    return ''.join(pwd)

print(generate_password())  # K8#mP2@vL9!q

3. A/B 測試流量分流


def assign_variant(user_id, variants=['A', 'B'], weights=[0.5, 0.5]):
    """基於用戶 ID 確定性分流(同用戶固定版本)"""
    rng = random.Random(hash(user_id) % (2**32))
    return rng.choices(variants, weights=weights, k=1)[0]

for uid in range(5):
    print(f"User {uid}: {assign_variant(uid)}")

4. 蒙地卡羅模擬估算 π


def estimate_pi(samples=1000000):
    inside = 0
    for _ in range(samples):
        x, y = random.random(), random.random()
        if x*x + y*y <= 1:
            inside += 1
    return 4 * inside / samples

print(estimate_pi(100000))  # 3.14152

5. 洗牌演示:撲克牌發牌


suits = ['♠', '♥', '♦', '♣']
ranks = ['A'] + [str(i) for i in range(2,11)] + ['J', 'Q', 'K']
deck = [r + s for s in suits for r in ranks]

random.shuffle(deck)
hands = [deck[i::4] for i in range(4)]  # 4 玩家各 13 張
for i, hand in enumerate(hands):
    print(f"Player {i+1}: {' '.join(sorted(hand))}")

安全性考量:random vs secrets

場景推薦模組原因
遊戲、模擬、測試、科學計算random速度快、可重現、分佈豐富
密碼、Token、Session ID、加密金鑰secrets (Py 3.6+)密碼學安全、不可預測
UUID 生成uuid.uuid4()標準 RFC 4122

# 安全隨機
import secrets
token = secrets.token_urlsafe(32)   # URL 安全 Base64
pwd = secrets.token_hex(16)         # 16 bytes hex
otp = ''.join(str(secrets.randbelow(10)) for _ in range(6))  # 6 位數字 OTP

效能與最佳實務

  • 批量生成:[random.random() for _ in range(N)] 比迴圈 append 快。
  • 大量整數:random.choices(range(1000), k=100000) 效能佳。
  • 避免全域狀態污染:多執行緒或庫開發請用獨立 Random() 實例。
  • 種子管理:測試固定種子,生產勿手動設種子(預設系統熵源)。

總結

random 模組是 Python 標準庫隨機數生成的核心,提供整數、浮點數、序列操作、多種分佈、種子控制。掌握 choice/sample/shuffle/choices 四大序列操作、seed 可重現性、Random() 實例隔離,能應對 95% 非密碼學隨機需求。**密碼學相關務必用 secrets 模組**。理解偽隨機本質(確定性演算法),正確選擇工具、管理種子、隔離狀態,寫出可測試、可維護、安全的隨機程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved