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的多重继承的理解
Aug 06 Python
Python模拟三级菜单效果
Sep 11 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
python队列queue模块详解
Apr 27 Python
python实现抖音视频批量下载
Jun 20 Python
用vue.js组件模拟v-model指令实例方法
Jul 05 Python
Python 控制终端输出文字的实例
Jul 12 Python
python实现的爬取电影下载链接功能示例
Aug 26 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
基于FME使用Python过程图解
May 13 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 Python
python超详细实现完整学生成绩管理系统
Mar 17 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
搭建vue开发环境
2018/07/19 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
python根据出生日期获得年龄的方法
2015/03/31 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
举例讲解Python装饰器
2020/12/24 Python
python函数超时自动退出的实操方法
2020/12/28 Python
英国手机零售商:Metrofone
2019/03/18 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
Linux系统下安装PHP7.3版本
2021/06/26 PHP
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python