Python利用带权重随机数解决抽奖和游戏爆装备问题


Posted in Python onJune 16, 2016

关于带权随机数
为了帮助理解,先来看三类随机问题的对比:
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, 图示如下,谁占的区间大(权重高),被选上的概率更大。

Python利用带权重随机数解决抽奖和游戏爆装备问题

在抽奖和游戏爆装备中的运用
带权随机在游戏开发中重度使用,各种抽奖和爆装备等.
运营根据需要来配置各个物品出现的概率.
今天要说的这个带权随机算法思想很简单,就是"把所有物品根据其权重构成一个个区间,权重大的区间大.可以想象成一个饼图.  然后,扔骰子,看落在哪个区间,"
举个栗子,有个年终抽奖,物品是iphone/ipad/itouch.
主办方配置的权重是[('iphone', 10), ('ipad', 40), ('itouch', 50)].
用一行代码即可说明其思想,即random.choice(['iphone']*10 + ['ipad']*40 + ['itouch']*50).
下面,我们写成一个通用函数.

#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<w: 
      break 
    n -= w 
  return x 
 
print weighted_random([('iphone', 10), ('ipad', 40), ('itouch', 50)])

上面的代码够直观,不过细心的会发现,每次都会计算total,每次都会线性遍历区间进行减操作.其实我们可以先存起来,查表就行了.利用accumulate+bisect二分查找.
物品越多,二分查找提升的性能越明显.

#coding=utf-8 
class WeightRandom: 
  def __init__(self, items): 
    weights = [w for _,w in items] 
    self.goods = [x for x,_ in items] 
    self.total = sum(weights) 
    self.acc = list(self.accumulate(weights)) 
 
  def accumulate(self, weights):#累和.如accumulate([10,40,50])->[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 相关文章推荐
python 不关闭控制台的实现方法
Oct 23 Python
学习python 之编写简单乘法运算题
Feb 27 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
Python 安装setuptools和pip工具操作方法(必看)
May 22 Python
通过python改变图片特定区域的颜色详解
Jul 15 Python
对django layer弹窗组件的使用详解
Aug 31 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 #Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 #Python
浅析Python中else语句块的使用技巧
Jun 16 #Python
python基础教程之分支、循环简单用法
Jun 16 #Python
python3音乐播放器简单实现代码
Apr 20 #Python
使用python3.5仿微软记事本notepad
Jun 15 #Python
python3.5仿微软计算器程序
Mar 30 #Python
You might like
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
怎么使 Mysql 数据同步
2006/10/09 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
python分割列表(list)的方法示例
2017/05/07 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
python实现字符串和字典的转换
2018/09/29 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
Python 合并拼接字符串的方法
2020/07/28 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
初任培训自我鉴定
2013/10/07 职场文书
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
广告学毕业生求职信
2014/01/30 职场文书
完美的中文自荐信
2014/05/24 职场文书
计生专干事迹
2014/05/28 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android