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 yield使用方法示例
Dec 04 Python
python的mysqldb安装步骤详解
Aug 14 Python
Python统计单词出现的次数
Apr 04 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
python实现图书借阅系统
Feb 20 Python
Django框架自定义session处理操作示例
May 27 Python
python 字典套字典或列表的示例
Dec 16 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
UI自动化定位常用实现方法代码示例
Oct 27 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 mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
php导入模块文件分享
2015/03/17 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
php链式操作的实现方式分析
2019/08/12 PHP
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
Python中functools模块的常用函数解析
2016/06/30 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
《埃及的金字塔》教学反思
2014/04/07 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技