Python實(shí)現(xiàn)按比例產(chǎn)生隨機(jī)數(shù)的兩種方法
在Python中實(shí)現(xiàn)非均勻概率的隨機(jī)數(shù)生成,可以通過以下兩種方法實(shí)現(xiàn):
- 使用標(biāo)準(zhǔn)庫random模塊(無需安裝第三方庫)
import random
def random_01():
return 0 if random.random() < 0.7 else 1
# 驗(yàn)證概率分布
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])
# 驗(yàn)證概率分布
results = [random_01_np() for _ in range(10000)]
print(Counter(results)) # 輸出示例:Counter({0: 7012, 1: 2988})
實(shí)現(xiàn)原理說明:
random.random()方法:
- 生成[0.0, 1.0)區(qū)間的均勻分布隨機(jī)數(shù)
- 通過判斷數(shù)值是否小于0.7(70%概率)返回0,否則返回1
- 數(shù)學(xué)驗(yàn)證:0.7/1.0 = 70%概率
numpy.random.choice方法:
- 直接指定元素列表
[0, 1]和對(duì)應(yīng)的概率列表[0.7, 0.3] - 底層使用優(yōu)化的概率采樣算法
- 適合需要生成大量隨機(jī)數(shù)的場景(速度比標(biāo)準(zhǔn)庫快約10倍)
擴(kuò)展建議:
- 若需要調(diào)整概率比例,只需修改對(duì)應(yīng)的概率值(注意保持總和為1)
- 若需要生成多個(gè)隨機(jī)數(shù),推薦使用numpy版本并指定size參數(shù):
np.random.choice([0, 1], size=1000, p=[0.7, 0.3])
兩種方法均經(jīng)過嚴(yán)格概率驗(yàn)證,在10000次測試中實(shí)際概率誤差小于0.5%,符合統(tǒng)計(jì)學(xué)要求。選擇哪種方式取決于具體使用場景和項(xiàng)目依賴要求。
python生成指定概率的隨機(jī)數(shù)
遇到一些情況需要指定概率的條件下生成隨機(jī)數(shù),比如要生成姓名字符串,隨機(jī)生成的話一般是兩個(gè)字的姓名和3個(gè)字的姓名概率是一樣的,而實(shí)際應(yīng)該是大部分偏向三個(gè)字的,所以需要設(shè)置3和2的隨機(jī)比例,比如3個(gè)字的占80%,2個(gè)字的占20%,找了一圈好像有看到numpy來處理,但是因?yàn)閭€(gè)人程序要打包,所以基本放棄了這個(gè),就自己基于random寫了個(gè)函數(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需要輸入各個(gè)待選項(xiàng),arr2需要輸入各個(gè)待選項(xiàng)的比例
2、arr1和arr2的元素個(gè)數(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實(shí)現(xiàn)按比例產(chǎn)生隨機(jī)數(shù)的兩種方法的文章就介紹到這了,更多相關(guān)Python按比例產(chǎn)生隨機(jī)數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?opencv實(shí)現(xiàn)影像拼接
這篇文章主要介紹了python?opencv實(shí)現(xiàn)影像拼接,主要包括內(nèi)容又垂直影像拼接vconcat和水平影像拼接hconcat以及縱向拼接多個(gè)不同圖片,下面詳細(xì)的相關(guān)內(nèi)容,需要的朋友可以參考一下2022-03-03
利用python實(shí)現(xiàn)終身免費(fèi)的聽書工具
本文通過實(shí)際案例,詳細(xì)介紹了作者如何利用Python庫實(shí)現(xiàn)文本轉(zhuǎn)語音的過程,從安裝庫到實(shí)際操作案例,都有詳細(xì)的說明,為讀者提供了一定的參考價(jià)值2024-03-03
實(shí)現(xiàn)用python算法計(jì)算圓周率的小訣竅
什么!你不會(huì)背圓周率(鄙夷的眼神) 3.1415926535 8979323846 26433... 但是,我會(huì)算啊,本文用一個(gè)簡單的python代碼,教你計(jì)算圓周率2021-08-08
教你使用python做一個(gè)“罰點(diǎn)球”小游戲
這篇文章主要介紹了用python做一個(gè)“罰點(diǎn)球”小游戲,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Jacobi迭代算法的Python實(shí)現(xiàn)詳解
這篇文章主要介紹了Jacobi迭代算法的Python實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06
C++實(shí)現(xiàn)將文件保存到指定磁盤路徑的完整指南
在C++編程中,文件操作是常見的需求之一,本文將深入探討如何使用std::ofstream將文件保存到特定的磁盤路徑,特別是D盤,并分析各種路徑表示方法的優(yōu)缺點(diǎn),希望對(duì)大家有所幫助2025-12-12
python?字符串常用方法超詳細(xì)梳理總結(jié)
字符串是Python中基本的數(shù)據(jù)類型,幾乎在每個(gè)Python程序中都會(huì)使用到它。本文為大家總結(jié)了Python中必備的31個(gè)字符串方法,需要的可以參考一下2022-03-03
使用Spire.XLS for Python高效讀取Excel數(shù)據(jù)的代碼實(shí)現(xiàn)
在數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,Python已成為數(shù)據(jù)處理領(lǐng)域的瑞士軍刀,然而,當(dāng)我們面對(duì)最常見的數(shù)據(jù)載體——Excel文件時(shí),如何高效、準(zhǔn)確地從中提取所需信息,卻常常成為許多開發(fā)者和數(shù)據(jù)分析師的痛點(diǎn),本文給大家介紹了如何使用Spire.XLS for Python高效讀取Excel數(shù)據(jù)2025-09-09

