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 opencv实现影像拼接

    python opencv实现影像拼接

    这篇文章主要介绍了python opencv实现影像拼接,主要包括内容又垂直影像拼接vconcat和水平影像拼接hconcat以及纵向拼接多个不同图片,下面详细的相关内容,需要的朋友可以参考一下
    2022-03-03
  • python 多线程共享全局变量的优劣

    python 多线程共享全局变量的优劣

    这篇文章主要介绍了python 多线程共享全局变量的优劣,帮助大家更好的理解和学习python多线程,感兴趣的朋友可以了解下
    2020-09-09
  • 利用python实现终身免费的听书工具

    利用python实现终身免费的听书工具

    本文通过实际案例,详细介绍了作者如何利用Python库实现文本转语音的过程,从安装库到实际操作案例,都有详细的说明,为读者提供了一定的参考价值
    2024-03-03
  • 实现用python算法计算圆周率的小诀窍

    实现用python算法计算圆周率的小诀窍

    什么!你不会背圆周率(鄙夷的眼神) 3.1415926535 8979323846 26433... 但是,我会算啊,本文用一个简单的python代码,教你计算圆周率
    2021-08-08
  • Python中Class类用法实例分析

    Python中Class类用法实例分析

    这篇文章主要介绍了Python中Class类用法,以实例形式较为详细的分析了Python中类的定义及相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 教你使用python做一个“罚点球”小游戏

    教你使用python做一个“罚点球”小游戏

    这篇文章主要介绍了用python做一个“罚点球”小游戏,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Jacobi迭代算法的Python实现详解

    Jacobi迭代算法的Python实现详解

    这篇文章主要介绍了Jacobi迭代算法的Python实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • C++实现将文件保存到指定磁盘路径的完整指南

    C++实现将文件保存到指定磁盘路径的完整指南

    在C++编程中,文件操作是常见的需求之一,本文将深入探讨如何使用std::ofstream将文件保存到特定的磁盘路径,特别是D盘,并分析各种路径表示方法的优缺点,希望对大家有所帮助
    2025-12-12
  • python 字符串常用方法超详细梳理总结

    python 字符串常用方法超详细梳理总结

    字符串是Python中基本的数据类型,几乎在每个Python程序中都会使用到它。本文为大家总结了Python中必备的31个字符串方法,需要的可以参考一下
    2022-03-03
  • 使用Spire.XLS for Python高效读取Excel数据的代码实现

    使用Spire.XLS for Python高效读取Excel数据的代码实现

    在数据驱动的时代,Python已成为数据处理领域的瑞士军刀,然而,当我们面对最常见的数据载体——Excel文件时,如何高效、准确地从中提取所需信息,却常常成为许多开发者和数据分析师的痛点,本文给大家介绍了如何使用Spire.XLS for Python高效读取Excel数据
    2025-09-09

最新评论