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读取Android permission文件
Nov 01 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
Django中的模型类设计及展示示例详解
May 29 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
pandas apply多线程实现代码
Aug 17 Python
python“静态”变量、实例变量与本地变量的声明示例
Nov 13 Python
如何用python绘制雷达图
Apr 24 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
smarty简单入门实例
2014/11/28 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
JQuery 操作/获取table具体代码
2013/06/13 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Python socket编程实例详解
2015/05/27 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Python对List中的元素排序的方法
2018/04/01 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
python支付宝支付示例详解
2019/08/22 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
详解Django配置JWT认证方式
2020/05/09 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
J2EE面试题
2016/03/14 面试题
财务人员个人求职信范文
2013/12/04 职场文书
学生会离职感言
2014/02/11 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
民事答辩状范本
2015/05/21 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
Python学习开发之图形用户界面详解
2021/08/23 Python