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调用C/C++动态链接库的方法详解
Jul 22 Python
在Python中操作列表之List.pop()方法的使用
May 21 Python
Python中元组,列表,字典的区别
May 21 Python
python主线程捕获子线程的方法
Jun 17 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
python判断输入日期为第几天的实例
Nov 13 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
python为QT程序添加图标的方法详解
Mar 09 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
django表单中的按钮获取数据的实例分析
Jul 31 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操作MongoDB类实例
2015/06/17 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
Python3实现连接SQLite数据库的方法
2014/08/23 Python
python xml解析实例详解
2016/11/14 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
总经理职责范文
2013/11/08 职场文书
关于工作经历的证明书
2014/10/11 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书