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 除法小技巧
Sep 06 Python
easy_install python包安装管理工具介绍
Feb 10 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
Tensorflow之Saver的用法详解
Apr 23 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
Python zip函数打包元素实例解析
Dec 11 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
Python实现计算图像RGB均值方式
Jun 04 Python
Python函数调用追踪实现代码
Nov 27 Python
python中的None与NULL用法说明
May 25 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
一篇入门的php Class 文章
2007/04/04 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
Koa日志中间件封装开发详解
2019/03/09 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
python3实现windows下同名进程监控
2018/06/21 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
安全生产检查通报
2014/01/29 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
群众路线个人整改方案
2014/10/25 职场文书
工作时间证明
2015/06/15 职场文书
2016高考寄语集锦
2015/12/04 职场文书
Go语言基础函数基本用法及示例详解
2021/11/17 Golang
MySQL数据库查询之多表查询总结
2022/08/05 MySQL