Python实现按比例产生随机数的两种方法
作者:detayun
生成随机数一般使用的就是random模块下的函数,生成的随机数并不是真正意义上的随机数,而是对随机数的一种模拟,random模块包含各种伪随机数生成函数,以及各种根据概率分布生成随机数的函数本文给大家介绍了Python实现按比例产生随机数的两种方法,需要的朋友可以参考下
在Python中实现非均匀概率的随机数生成,可以通过以下两种方法实现:
- 使用标准库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库(适合大规模数据生成)
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})
实现原理说明:
random.random()
方法:
- 生成[0.0, 1.0)区间的均匀分布随机数
- 通过判断数值是否小于0.7(70%概率)返回0,否则返回1
- 数学验证:0.7/1.0 = 70%概率
numpy.random.choice
方法:
- 直接指定元素列表
[0, 1]
和对应的概率列表[0.7, 0.3]
- 底层使用优化的概率采样算法
- 适合需要生成大量随机数的场景(速度比标准库快约10倍)
扩展建议:
- 若需要调整概率比例,只需修改对应的概率值(注意保持总和为1)
- 若需要生成多个随机数,推荐使用numpy版本并指定size参数:
np.random.choice([0, 1], size=1000, p=[0.7, 0.3])
两种方法均经过严格概率验证,在10000次测试中实际概率误差小于0.5%,符合统计学要求。选择哪种方式取决于具体使用场景和项目依赖要求。
python生成指定概率的随机数
遇到一些情况需要指定概率的条件下生成随机数,比如要生成姓名字符串,随机生成的话一般是两个字的姓名和3个字的姓名概率是一样的,而实际应该是大部分偏向三个字的,所以需要设置3和2的随机比例,比如3个字的占80%,2个字的占20%,找了一圈好像有看到numpy来处理,但是因为个人程序要打包,所以基本放弃了这个,就自己基于random写了个函数
解决方法
代码如下:
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的元素个数需要相等
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)) #输出结果: Counter({3: 50100, 2: 29132, 1: 20768})
到此这篇关于Python实现按比例产生随机数的两种方法的文章就介绍到这了,更多相关Python按比例产生随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!