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解析json实例方法
Nov 19 Python
列举Python中吸引人的一些特性
Apr 09 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
VSCode下好用的Python插件及配置
Apr 06 Python
python pygame模块编写飞机大战
Nov 20 Python
python画图把时间作为横坐标的方法
Jul 07 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
5款实用的python 工具推荐
Oct 13 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
详解Python模块化编程与装饰器
Jan 16 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
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
jQuery 处理表单元素的代码
2010/02/15 Javascript
js 内存释放问题
2010/04/25 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
python实现串口通信的示例代码
2020/02/10 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
初级Java程序员面试题
2016/03/03 面试题
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
环保专业大学生职业规划设计
2014/01/10 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
食品流通安全承诺书
2014/05/22 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
学习心理学的体会
2014/11/07 职场文书
贫困证明书范文
2015/06/16 职场文书
调研报告的主要写法
2019/04/18 职场文书