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的迭代器和生成器使用实例
Jan 14 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
python模块之re正则表达式详解
Feb 03 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
python3 pygame实现接小球游戏
May 14 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
在自动化中用python实现键盘操作的方法详解
Jul 19 Python
python判断all函数输出结果是否为true的方法
Dec 03 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
通过html表格发电子邮件
2006/10/09 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
PHP最常用的正则表达式
2017/02/13 PHP
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
微信小程序开发探究
2016/12/27 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
Python eval函数介绍及用法
2020/11/09 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
python SOCKET编程基础入门
2021/02/27 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
原装进口全世界:天猫国际
2016/08/03 全球购物
2014年幼儿园保育工作总结
2014/12/02 职场文书
可怜妈妈观后感
2015/06/09 职场文书
获奖感言范文
2015/07/31 职场文书
九年级历史教学反思
2016/02/19 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers