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给文本创立向量空间模型的教程
Apr 23 Python
python pandas dataframe 行列选择,切片操作方法
Apr 10 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
Python全栈之列表数据类型详解
Oct 01 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
Python xlwings插入Excel图片的实现方法
Feb 26 Python
python常量折叠基础知识点讲解
Feb 28 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
php cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
Python中的fileinput模块的简单实用示例
2015/07/09 Python
使用Python对Access读写操作
2017/03/30 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
python 实现目录复制的三种小结
2019/12/04 Python
python实现tail -f 功能
2020/01/17 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
质检部部长职责
2013/12/16 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
村党支部换届选举方案
2014/05/02 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
班主任工作总结范文
2015/08/13 职场文书