python按概率生成随机数

Talk is cheap, show me the code.

random_demo.py代码如下:

# coding: utf-8
import random

def random_index(rate):
    """随机变量的概率函数"""
	#
    # 参数rate为list<int>
    # 返回概率事件的下标索引
    start = 0
    index = 0
    randnum = random.randint(1, sum(rate))

    for index, scope in enumerate(rate):
        start += scope
        if randnum <= start:
            break
    return index

def main():
    arr = ['red', 'green', 'blue']
    rate = [45, 30, 25]

    red_times = 0
    green_times = 0
    blue_times = 0
    for i in xrange(10000):
        if arr[random_index(rate)] == 'red':
            red_times += 1
        if arr[random_index(rate)] == 'green':
            green_times += 1
        if arr[random_index(rate)] == 'blue':
            blue_times += 1

    print red_times, green_times, blue_times

if __name__ == '__main__':
    main()

打印结果:

$ python random_demo.py 
4507 3009 2537
$ python random_demo.py 
4586 3055 2485
$ python random_demo.py 
4483 2996 2506
$ python random_demo.py 
4586 3015 2480
$ python random_demo.py 
4513 3057 2415
$ python random_demo.py 
4494 3014 2456
$ python random_demo.py 
4502 2978 2505
$ python random_demo.py 
4475 3041 2528
$ python random_demo.py 
4561 3043 2520
$ python random_demo.py 
4558 2923 2474
$ python random_demo.py 
4536 2957 2535
$ python random_demo.py 
4526 2985 2576
$ python random_demo.py 
4532 2936 2547
$ python random_demo.py 
4420 2908 2447

温馨提示:以上代码示例代码使用的是Python2.7, 且考虑不严谨, 已替换为以下python3示例代码, 保证3种概率事件次数加起来等于总次数:

import random


def random_index(rate):
    """随机变量的概率函数"""
    #
    # 参数rate为list<int>
    # 返回概率事件的下标索引
    start = 0
    index = 0
    randnum = random.randint(1, sum(rate))

    for index, scope in enumerate(rate):
        start += scope
        if randnum <= start:
            break
    return index


def main():
    arr = ['red', 'green', 'blue']
    rate = [45, 30, 25]

    red_times = 0
    green_times = 0
    blue_times = 0
    count = 0
    for i in range(10000):
        count += 1
        index = random_index(rate)
        if arr[index] == 'red':
            red_times += 1
        elif arr[index] == 'green':
            green_times += 1
        elif arr[index] == 'blue':
            blue_times += 1

    print(count, red_times, green_times, blue_times)


if __name__ == '__main__':
    main()

可以看到结果, 抽中红绿蓝的次数非常接近它们的概率比例45:30:25, 其中random_index(rate)函数为核心代码.

另一变种:

import random

def get_value_with_probability(probabilities):
    # 生成一个随机数在0到1之间
    rand_num = random.random()
    
    cumulative_prob = 0.0
    for value, probability in probabilities.items():
        cumulative_prob += probability
        if rand_num < cumulative_prob:
            return value

# 指定值和对应的概率
probabilities = {'A': 0.4, 'B': 0.3, 'C': 0.2, 'D': 0.1}

# 调用函数获取随机值
random_value = get_value_with_probability(probabilities)

print("Randomly selected value:", random_value)

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值