python加权随机_Python中的加权随机

本文介绍了Python中实现加权随机的四种方法,包括简单的线性方法、使用bisect加速、去掉临时变量以及利用accumulate函数。对于需要多次从带有权重的列表中随机选取元素的情况,提供了性能更优的解决方案。
摘要由CSDN通过智能技术生成

我们平时比较多会遇到的一种情景是从一堆的数据中随机选择一个, 大多数我们使用random就够了, 但是假如我们要选取的这堆数据分别有自己的权重, 也就是他们被选择的概率是不一样的, 在这种情况下, 就需要使用加权随机来处理这些数据

1. 简单线性方法

下面是一种简单的方案, 传入权重的列表(weights), 然后会返回随机结果的索引值(index), 比如我们传入[2, 3, 5], 那么就会随机的返回0(概率0.2), 1(概率0.3), 2(概率0.5)

简单的思路就是把所有的权重加和, 然后随机一个数, 看看落在哪个区间

import random

def weighted_choice(weights):

totals = []

running_total = 0

for w in weights:

running_total += w

totals.append(running_total)

rnd = random.random() * running_total

for i, total in enumerate(totals):

if rnd < total:

return i

2. 加速搜索

上面这个方法看起来非常简单, 已经可以完成我们所要的加权随机, 然是最后的这个for循环貌似有些啰嗦, Python有个内置方法bisect可以帮我们加速这一步

import random

import bisect

def weighted_choice(weights):

totals = []

running_total = 0

for w in weights:

running_total += w

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值