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 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
使用Python的判断语句模拟三目运算
Apr 24 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
python中的闭包函数
Feb 09 Python
python如何实现数据的线性拟合
Jul 19 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
python与mysql数据库交互的实现
Jan 06 Python
python 弧度与角度互转实例
Apr 15 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
Python random模块的使用示例
Oct 10 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
PHP中is_dir()函数使用指南
2015/05/08 PHP
php验证码生成器
2017/05/24 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
jquery mobile实现拨打电话功能的几种方法
2013/08/05 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
react-native fetch的具体使用方法
2017/11/01 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
Windows下安装python2和python3多版本教程
2017/03/30 Python
基于Python闭包及其作用域详解
2017/08/28 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
审计班子对照检查材料
2014/08/27 职场文书
安全教育培训制度
2015/08/06 职场文书
Django实现聊天机器人
2021/05/31 Python
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server