为了实现一个带权无回置随机抽选函数,我们需要以下几个步骤:
1. 确定数据结构
将需要进行抽选的元素,以及每个元素对应的权重存储到一个列表中,并将其转化为一个字典。字典的键为元素,值为对应的权重。例如,以下字典代表了4个元素及其对应的权重:
weights = {
'A': 10,
'B': 5,
'C': 3,
'D': 2
}
2. 计算总权重
通过遍历字典的值,计算出所有元素的总权重。
total_weight = sum(weights.values())
3. 随机生成一个0-1之间的浮点数
使用random
库的random()
函数生成一个0-1之间的随机浮点数,用于决定最后选中的元素。
rand = random.random()
4. 根据权重进行抽选
根据上一步生成的随机数,在字典中进行遍历,累计遍历过的元素的权重,当权重之和大于随机数所代表的值时停止遍历,此时即为抽选成功的元素。
accum_weight = 0
for item, weight in weights.items():
accum_weight += weight / total_weight
if accum_weight > rand:
return item
完整代码展示:
import random
def weighted_pick(weights):
total_weight = sum(weights.values())
rand = random.random()
accum_weight = 0
for item, weight in weights.items():
accum_weight += weight / total_weight
if accum_weight > rand:
return item
至此,我们就可以使用weighted_pick()
函数进行带权无回置随机抽选了。以下是两个简单的使用示例:
示例1:从列表中随机抽取字符串
fruits = {'apple': 2, 'banana': 3, 'orange': 1, 'grape': 4}
for i in range(10):
fruit = weighted_pick(fruits)
print(fruit)
输出结果可能为:
banana
apple
banana
banana
grape
banana
grape
banana
grape
banana
示例2:从元组中随机抽取元素
movies = {'Action': 100, 'Comedy': 80, 'Drama': 50}
for i in range(5):
genre = weighted_pick(movies)
print(f'Movie genre: {genre}')
输出结果可能为:
Movie genre: Action
Movie genre: Comedy
Movie genre: Drama
Movie genre: Action
Movie genre: Action
以上就是Python实现一个带权无回置随机抽选函数的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现一个带权无回置随机抽选函数的方法 - Python技术站