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 29 Python
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
python获取txt文件词向量过程详解
Jul 05 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
openCV提取图像中的矩形区域
Jul 21 Python
python request 模块详细介绍
Nov 10 Python
python中slice参数过长的处理方法及实例
Dec 15 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
javascript 小型动画组件与实现代码
2010/06/02 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
php实现数字补零的方法总结
2018/09/12 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
js 字符串操作函数
2009/07/25 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
js转html实体的方法
2016/09/27 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
Python Paramiko模块的安装与使用详解
2016/11/18 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
重构Python代码的六个实例
2020/11/25 Python
用python制作个视频下载器
2021/02/01 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
公司总经理助理岗位职责
2014/07/09 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
校本研修个人总结
2015/02/28 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
Python实现生成bmp图像的方法
2021/06/13 Python