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 22 Python
bpython 功能强大的Python shell
Feb 16 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
python Django中models进行模糊查询的示例
Jul 18 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
对django layer弹窗组件的使用详解
Aug 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函数常用用法小结
2010/02/08 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python 中random模块的常用方法总结
2017/07/08 Python
Python2随机数列生成器简单实例
2017/09/04 Python
python实现比较文件内容异同
2018/06/22 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
python实现四人制扑克牌游戏
2020/04/22 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
外语学院毕业生的自我鉴定
2013/11/28 职场文书
护理不良事件检讨书
2014/02/06 职场文书
优秀教师感人事迹材料
2014/05/04 职场文书
导师工作推荐信范文
2014/05/17 职场文书
英文演讲稿开场白
2014/08/25 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
幼儿园辞职书
2015/02/26 职场文书
python如何获取网络数据
2021/04/11 Python
Python中的变量与常量
2021/11/11 Python