Python實現(xiàn)按比例產(chǎn)生隨機數(shù)的兩種方法
在Python中實現(xiàn)非均勻概率的隨機數(shù)生成,可以通過以下兩種方法實現(xiàn):
- 使用標準庫random模塊(無需安裝第三方庫)
import random
def random_01():
return 0 if random.random() < 0.7 else 1
# 驗證概率分布
from collections import Counter
results = [random_01() for _ in range(10000)]
print(Counter(results)) # 輸出示例:Counter({0: 7023, 1: 2977})
- 使用numpy庫(適合大規(guī)模數(shù)據(jù)生成)
import numpy as np
def random_01_np():
return np.random.choice([0, 1], p=[0.7, 0.3])
# 驗證概率分布
results = [random_01_np() for _ in range(10000)]
print(Counter(results)) # 輸出示例:Counter({0: 7012, 1: 2988})
實現(xiàn)原理說明:
random.random()方法:
- 生成[0.0, 1.0)區(qū)間的均勻分布隨機數(shù)
- 通過判斷數(shù)值是否小于0.7(70%概率)返回0,否則返回1
- 數(shù)學(xué)驗證:0.7/1.0 = 70%概率
numpy.random.choice方法:
- 直接指定元素列表
[0, 1]和對應(yīng)的概率列表[0.7, 0.3] - 底層使用優(yōu)化的概率采樣算法
- 適合需要生成大量隨機數(shù)的場景(速度比標準庫快約10倍)
擴展建議:
- 若需要調(diào)整概率比例,只需修改對應(yīng)的概率值(注意保持總和為1)
- 若需要生成多個隨機數(shù),推薦使用numpy版本并指定size參數(shù):
np.random.choice([0, 1], size=1000, p=[0.7, 0.3])
兩種方法均經(jīng)過嚴格概率驗證,在10000次測試中實際概率誤差小于0.5%,符合統(tǒng)計學(xué)要求。選擇哪種方式取決于具體使用場景和項目依賴要求。
python生成指定概率的隨機數(shù)
遇到一些情況需要指定概率的條件下生成隨機數(shù),比如要生成姓名字符串,隨機生成的話一般是兩個字的姓名和3個字的姓名概率是一樣的,而實際應(yīng)該是大部分偏向三個字的,所以需要設(shè)置3和2的隨機比例,比如3個字的占80%,2個字的占20%,找了一圈好像有看到numpy來處理,但是因為個人程序要打包,所以基本放棄了這個,就自己基于random寫了個函數(shù)
解決方法
代碼如下:
def p_random(arr1,arr2):
assert len(arr1) == len(arr2), "Length does not match."
assert sum(arr2) == 1 , "Total rate is not 1."
sup_list = [len(str(i).split(".")[-1]) for i in arr2]
top = 10 ** max(sup_list)
new_rate = [int(i*top) for i in arr2]
rate_arr = []
for i in range(1,len(new_rate)+1):
rate_arr.append(sum(new_rate[:i]))
rand = random.randint(1,top)
data = None
for i in range(len(rate_arr)):
if rand <= rate_arr[i]:
data = arr1[i]
break
return data
使用說明:
1、arr1需要輸入各個待選項,arr2需要輸入各個待選項的比例
2、arr1和arr2的元素個數(shù)需要相等
3、arr2的概率總和要等于1
測試情況:
plist = []
for i in range(100000):
plist.append( p_random([1,2,3],[0.209,0.291,0.5]))
print(Counter(plist))
#輸出結(jié)果:
Counter({3: 50100, 2: 29132, 1: 20768})
到此這篇關(guān)于Python實現(xiàn)按比例產(chǎn)生隨機數(shù)的兩種方法的文章就介紹到這了,更多相關(guān)Python按比例產(chǎn)生隨機數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spire.XLS for Python高效讀取Excel數(shù)據(jù)的代碼實現(xiàn)
在數(shù)據(jù)驅(qū)動的時代,Python已成為數(shù)據(jù)處理領(lǐng)域的瑞士軍刀,然而,當我們面對最常見的數(shù)據(jù)載體——Excel文件時,如何高效、準確地從中提取所需信息,卻常常成為許多開發(fā)者和數(shù)據(jù)分析師的痛點,本文給大家介紹了如何使用Spire.XLS for Python高效讀取Excel數(shù)據(jù)2025-09-09

