python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python按比例产生随机数

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

作者: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()方法:
  1. numpy.random.choice方法:

扩展建议

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按比例产生随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文