Python实现基于权重的随机数2种方法


Posted in Python onApril 28, 2015

问题:

例如我们要选从不同省份选取一个号码,每个省份的权重不一样,直接选随机数肯定是不行的了,就需要一个模型来解决这个问题。
简化成下面的问题:

 字典的key代表是省份,value代表的是权重,我们现在需要一个函数,每次基于权重选择一个省份出来
{"A":2, "B":2, "C":4, "D":10, "E": 20}

解决:

这是能想到和能看到的最多的版本,不知道还没有更高效好用的算法。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
#python2.7x 
#random_weight.py 
#author: orangleliu@gmail.com 2014-10-11 
 
''''' 
每个元素都有权重,然后根据权重随机取值 
 
输入 {"A":2, "B":2, "C":4, "D":10, "E": 20} 
输出一个值 
''' 
import random 
import collections as coll 
 
data = {"A":2, "B":2, "C":4, "D":6, "E": 11} 
 
#第一种 根据元素权重值 "A"*2 ..等,把每个元素取权重个元素放到一个数组中,然后最数组下标取随机数得到权重 
def list_method(): 
 all_data = [] 
 for v, w in data.items(): 
  temp = [] 
  for i in range(w): 
   temp.append(v) 
  all_data.extend(temp) 
   
 n = random.randint(0,len(all_data)-1) 
 return all_data[n] 
  
#第二种 也是要计算出权重总和,取出一个随机数,遍历所有元素,把权重相加sum,当sum大于等于随机数字的时候停止,取出当前的元组 
def iter_method(): 
 total = sum(data.values()) 
 rad = random.randint(1,total) 
  
 cur_total = 0 
 res = "" 
 for k, v in data.items(): 
  cur_total += v 
  if rad<= cur_total: 
   res = k 
   break 
 return res 
  
  
def test(method): 
 dict_num = coll.defaultdict(int) 
 for i in range(100): 
  dict_num[eval(method)] += 1 
 for i,j in dict_num.items(): 
  print i, j  
  
if __name__ == "__main__": 
 test("list_method()") 
 print "-"*50 
 test("iter_method()")

一次执行的结果

A 4 
C 14 
B 7 
E 44 
D 31 
-------------------------------------------------- 
A 8 
C 16 
B 6 
E 43 
D 27

思路:

思路都很原始可以参考下面的连接,还有别的好方法一起交流!!
代码: https://gist.github.com/orangle/d83bec8984d0b4293710
参考:
https://3water.com/article/65060.htm
https://3water.com/article/65058.htm

Python 相关文章推荐
python使用urllib模块开发的多线程豆瓣小站mp3下载器
Jan 16 Python
Python之eval()函数危险性浅析
Jul 03 Python
深入讲解Python编程中的字符串
Oct 14 Python
Python中将字典转换为列表的方法
Sep 21 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
详解python单元测试框架unittest
Jul 02 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
python名片管理系统开发
Jun 18 Python
python利用文件时间批量重命名照片和视频
Feb 09 Python
python使用urllib2实现发送带cookie的请求
Apr 28 #Python
python实现在windows下操作word的方法
Apr 28 #Python
介绍Python的@property装饰器的用法
Apr 28 #Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 #Python
在Python中使用__slots__方法的详细教程
Apr 28 #Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 #Python
python将文本转换成图片输出的方法
Apr 28 #Python
You might like
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP实现递归无限级分类
2015/10/22 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
python删除文本中行数标签的方法
2018/05/31 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
党员倡议书
2015/01/19 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
2016年父亲节寄语
2015/12/04 职场文书
2016国培学习心得体会
2016/01/08 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
python中tkinter复选框使用操作
2021/11/11 Python