Python实现按比例产生随机数的两种方法

 更新时间:2025年08月28日 09:01:48   作者:detayun  
生成随机数一般使用的就是random模块下的函数,生成的随机数并不是真正意义上的随机数,而是对随机数的一种模拟,random模块包含各种伪随机数生成函数,以及各种根据概率分布生成随机数的函数本文给大家介绍了Python实现按比例产生随机数的两种方法,需要的朋友可以参考下

在Python中实现非均匀概率的随机数生成,可以通过以下两种方法实现:

  1. 使用标准库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})
  1. 使用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})

实现原理说明

  1. random.random()方法:
  • 生成[0.0, 1.0)区间的均匀分布随机数
  • 通过判断数值是否小于0.7(70%概率)返回0,否则返回1
  • 数学验证:0.7/1.0 = 70%概率
  1. 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按比例产生随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python的streamplot使用及说明

    Python的streamplot使用及说明

    这篇文章主要介绍了Python的streamplot使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • python日志模块logbook使用方法

    python日志模块logbook使用方法

    python自带了日志模块logging,可以用来记录程序运行过程中的日志信息。这篇文章主要介绍了python logbook使用方法,需要的朋友可以参考下
    2019-09-09
  • Pandas||过滤缺失数据||pd.dropna()函数的用法说明

    Pandas||过滤缺失数据||pd.dropna()函数的用法说明

    这篇文章主要介绍了Pandas||过滤缺失数据||pd.dropna()函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Python按条件删除Excel表格数据的方法(示例详解)

    Python按条件删除Excel表格数据的方法(示例详解)

    本文介绍基于Python语言,读取Excel表格文件,基于我们给定的规则,对其中的数据加以筛选,将不在指定数据范围内的数据剔除,保留符合我们需要的数据的方法,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • 浅谈Python生成器generator之next和send的运行流程(详解)

    浅谈Python生成器generator之next和send的运行流程(详解)

    下面小编就为大家带来一篇浅谈Python生成器generator之next和send的运行流程(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • scrapy-redis分布式爬虫的搭建过程(理论篇)

    scrapy-redis分布式爬虫的搭建过程(理论篇)

    这篇文章主要介绍了scrapy-redis分布式爬虫的搭建过程(理论篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Python3中的列表生成式、生成器与迭代器实例详解

    Python3中的列表生成式、生成器与迭代器实例详解

    这篇文章主要介绍了Python3中的列表生成式、生成器与迭代器,结合实例形式详细分析了Python3列表生成式、生成器与迭代器相关概念、功能、使用方法及操作注意事项,需要的朋友可以参考下
    2018-06-06
  • pytorch之深度神经网络概念全面整理

    pytorch之深度神经网络概念全面整理

    这篇文章主要介绍了pytorch之深度神经网络概念,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python基于正则表达式实现计算器功能

    Python基于正则表达式实现计算器功能

    这篇文章主要介绍了Python基于正则表达式实现计算器功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Python实现决策树C4.5算法的示例

    Python实现决策树C4.5算法的示例

    本篇文章主要介绍了Python实现决策树C4.5算法的示例,详解的介绍了决策树C4.5算法的原理和实现代码,非常具有实用价值,需要的朋友可以参考下
    2018-05-05

最新评论