python按概率生成随机数1
之前有个类似的帖子: https://blog.csdn.net/cryhelyxx/article/details/72822234 各位可以先看下,不过我没看懂他这么写的目的,好像是统计10000次生成红绿蓝色的情况分别是多少次,代码运行没什么问题,就是有时候会产生随机结果没有选中红绿蓝,这一点可以在最后结果加起来不等于10000看出来。不知道他要的就是这个效果还是有误。于是我修改了下,下面是我修改后的代码,保证了每次循环都能选中红绿蓝中的一个。 # coding: utf-8 import random import time def random_index(rate): "" 在Python编程中,有时我们需要按照特定的概率来生成随机数,比如在模拟实验或者游戏中,不同结果出现的可能性可能并不相同。上述问题中提到的代码正是为了实现这样一个功能:根据给定的概率分布(红、绿、蓝三种颜色的概率分别为45%、30%、25%)生成10000次随机选择,并统计每种颜色被选择的次数。 我们来看`random_index`函数。这个函数接受一个概率列表`rate`作为输入,列表中的每个元素代表一种事件的概率。函数的目标是返回与概率列表相对应的事件索引。它通过生成一个介于1到概率总和之间的随机整数`randnum`,然后遍历概率列表,累加概率值,当累加值大于或等于`randnum`时,返回当前索引。 在`main`函数中,我们定义了三个颜色`red`、`green`和`blue`,以及它们对应的概率列表`rate`。接着,我们用一个for循环模拟10000次随机选择,每次调用`random_index`函数获取颜色的索引,并根据索引更新对应颜色的计数。将结果存储在一个字典中并打印出来。 原始代码的问题在于,由于概率的随机性,有可能某些情况下生成的随机数不在任何概率范围内,导致结果中缺少某些颜色。修改后的代码解决了这个问题,确保每次循环都会选择到一个颜色。 此外,代码还测量了运行时间和性能。通过比较修改前后的运行时间,可以看出修改后的版本在效率上有所提升,但仍然可能存在优化的空间。实际上,可以使用更高效的方法,例如使用numpy库的`choice`函数,它可以更直接地根据概率分布生成随机样本。 ```python import numpy as np def random_index_rate(rate): return np.random.choice(range(len(rate)), p=rate) # ... 其他代码不变 ... ``` 这种方法利用了numpy对数组操作的优化,能够更快速地实现按概率生成随机数。 这段代码提供了一个基础的按概率生成随机数的解决方案,同时也展示了如何通过迭代和条件判断实现概率分布的选择。然而,对于大规模的模拟或性能要求高的应用,推荐使用更高效的库函数,如numpy的`choice`,以提高代码执行效率。