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追加元素到列表的方法
Jul 28 Python
python3中int(整型)的使用教程
Mar 23 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
使用Eclipse如何开发python脚本
Apr 11 Python
python2.7实现FTP文件下载功能
Apr 15 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
python检测IP地址变化并触发事件
Dec 26 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
Python中的pathlib.Path为什么不继承str详解
Jun 23 Python
python使用requests.session模拟登录
Aug 09 Python
Numpy 多维数据数组的实现
Jun 18 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 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
C#静态方法与非静态方法实例分析
2014/09/22 PHP
php中socket通信机制实例详解
2015/01/03 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
ionic实现底部分享功能
2017/05/11 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
深入koa-bodyparser原理解析
2019/01/16 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
python SVD压缩图像的实现代码
2019/11/05 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
Python中Selenium模块的使用详解
2020/10/09 Python
飞利浦美国官网:Philips美国
2020/02/28 全球购物
编辑硕士自荐信范文
2013/11/27 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
小学师德师风整改措施
2014/10/27 职场文书
Redis入门基础常用操作命令整理
2022/06/01 Redis