Python实现基于权重的随机数2种方法

 更新时间:2015年04月28日 09:57:17   投稿:junjie  
这篇文章主要介绍了Python实现基于权重的随机数2种方法,本文直接给出实现代码,需要的朋友可以参考下

问题:

例如我们要选从不同省份选取一个号码,每个省份的权重不一样,直接选随机数肯定是不行的了,就需要一个模型来解决这个问题。
简化成下面的问题:

 字典的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://www.jb51.net/article/65060.htm
https://www.jb51.net/article/65058.htm

相关文章

  • python3中@dataclass的实现示例

    python3中@dataclass的实现示例

    @dataclass 是 Python 3.7 引入的一个装饰器,用于方便地定义符合数据类协议的类,本文主要介绍了python3中@dataclass的实现示例,感兴趣的可以了解一下
    2024-02-02
  • python使用socket制作聊天室详细源码(可以直接运行)

    python使用socket制作聊天室详细源码(可以直接运行)

    Python是一个非常灵活的编程语言,我们现在到处可见用Python编写的应用程序,下面这篇文章主要给大家介绍了关于python使用socket制作聊天室的相关资料,文中的代码可以直接运行,需要的朋友可以参考下
    2023-12-12
  • 解决python 文本过滤和清理问题

    解决python 文本过滤和清理问题

    文本过滤和清理所涵盖的范围非常广泛,涉及文本解析和数据处理方面的问题。这篇文章主要介绍了解决python 文本过滤和清理问题,需要的朋友可以参考下
    2019-08-08
  • Python利用代理ip实现自动化爬虫任务管理

    Python利用代理ip实现自动化爬虫任务管理

    本文主要介绍了Python利用代理ip实现自动化爬虫任务管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 一文详解PyQt5中实现不规则窗口的显示

    一文详解PyQt5中实现不规则窗口的显示

    这篇文章主要为大家详细介绍了Python PyQt5中实现不规则窗口的显示的相关资料,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-12-12
  • python构造函数init实例方法解析

    python构造函数init实例方法解析

    这篇文章主要介绍了python构造函数init实例方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 解决Keras 自定义层时遇到版本的问题

    解决Keras 自定义层时遇到版本的问题

    这篇文章主要介绍了解决Keras 自定义层时遇到版本的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python开发准备工作之配置虚拟环境(非常重要)

    python开发准备工作之配置虚拟环境(非常重要)

    这篇文章主要介绍了python开发准备工作之配置虚拟环境(非常重要),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Python2.X/Python3.X中urllib库区别讲解

    Python2.X/Python3.X中urllib库区别讲解

    本篇文章通过对比给大家详细讲解了在Python2和Python3中urllib库区别以及用法讲解,有需要的朋友跟着学习下吧。
    2017-12-12
  • Python如何识别银行卡卡号?

    Python如何识别银行卡卡号?

    今天给大家带来的是有关Python的相关知识,文章围绕着Python如何识别银行卡卡号展开,文中有非常详细的代码示例及介绍,需要的朋友可以参考下
    2021-06-06

最新评论