关于带权随机数
为了帮助理解,先来看三类随机问题的对比:1.已有n条记录,从中选取m条记录,选取出来的记录前后顺序不管。实现思路:按行遍历所有记录,约隔n/m条取一个数据即可2.在1类情况下,还要求选取出来的m条记录是随机排序的实现思路: 给n条记录,分别增加一列标记,值为随机选取的1至n之间的不重复数据。3.区别于1,2类问题, 如果记录是有权重的,如何结合权重去随机选取。 比如a的权重为10, b的权重股为5, c的权重为1, 则随机选取4个时可能应该出现aabb。第3类问题便是本文重点了。实现思路: 以 a:10, b:5, c:1 三条记录上随机选取4条为例,(是否以权重排序这个无所谓) 对于 a 10 b 5 c 1首先,将第n行的数值赋为第n行加第n-1行的,递归执行,如下: a 10 b 15 c 16然后每次从[1,16]随机选取一个数,如果落在[1,10]之间,则选取a,如果落在(10,15]之间则选b,如果落在(16,16]之间则选取c, 图示如下,谁占的区间大(权重高),被选上的概率更大。
#coding=utf-8
import random
def weighted_random(items):
total = sum(w for _,w in items)
n = random.uniform(0, total)#在饼图扔骰子
for x, w in items:#遍历找出骰子所在的区间
if n[10,50,100]
cur = 0
for w in weights:
cur = cur+w
yield cur
def __call__(self):
return self.goods[bisect.bisect_right(self.acc , random.uniform(0, self.total))]
wr = weightrandom([(‘iphone’, 10), (‘ipad’, 40), (‘itouch’, 50)])
print wr()
更多python利用带权重随机数解决抽奖和游戏爆装备相关文章请关注php中文网!