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

   这篇文章主要介绍了Python实现基于权重的随机数2种方法,本文直接给出实现代码,需要的朋友可以参考下

  问题:

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

  简化成下面的问题:

  字典的key代表是省份,value代表的是权重,我们现在需要一个函数,每次基于权重选择一个省份出来

  {"A":2, "B":2, "C":4, "D":10, "E": 20}

  解决:

  这是能想到和能看到的最多的版本,不知道还没有更高效好用的算法。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

#!/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()")

  一次执行的结果

  ?

1
2
3
4
5
6
7
8
9
10
11

A 4
C 14
B 7
E 44
D 31
--------------------------------------------------
A 8
C 16
B 6
E 43
D 27

时间: 2024-08-08 01:42:14

Python实现基于权重的随机数2种方法的相关文章

让Python代码更快运行的5种方法

  这篇文章主要介绍了让Python代码更快运行的5种方法,本文分别介绍了PyPy.Pyston.Nuitka.Cython.Numba等开源软件,可以提升Python的运行效率,需要的朋友可以参考下 不论什么语言,我们都需要注意性能优化问题,提高执行效率.选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮.尽管Python从未如C和Java一般快速,但是不少Python项目都处于开发语言领先位置. Python很简单易用,但大多

python遍历 truple list dictionary的几种方法总结_python

实例如下: def TestDic1(): dict2 ={'aa':222,11:222} for val in dict2: print val def TestDic2(): dict2 ={'aa':222,11:222} for (key,val) in dict2.items(): print key,":",val def TestList1(): list=[1,2,3,4,5,3,2,'ada','fs3'] for i in range(len(list)): pr

Python中给List添加元素的4种方法分享_python

List 是 Python 中常用的数据类型,它一个有序集合,即其中的元素始终保持着初始时的定义的顺序(除非你对它们进行排序或其他修改操作). 在Python中,向List添加元素,方法有如下4种方法(append(),extend(),insert(), +加号) 1. append() 追加单个元素到List的尾部,只接受一个参数,参数可以是任何数据类型,被追加的元素在List中保持着原结构类型. 此元素如果是一个list,那么这个list将作为一个整体进行追加,注意append()和ext

Python简单检测文本类型的2种方法【基于文件头及cchardet库】_python

本文实例讲述了Python简单检测文本类型的方法.分享给大家供大家参考,具体如下: 1.根据文件头. #是否为带BOM头的UTF8文件 def IsUtf8BomFile(pathfile): if b'\xef\xbb\xbf' == open(pathfile, mode='rb').read(3)): return True return False 2.用cchardet库. >>> import cchardet >>> cchardet.detect(ope

Python动态加载模块的3种方法_python

1.使用系统函数__import_() 复制代码 代码如下: stringmodule = __import__('string') 2.使用imp 模块 复制代码 代码如下: import imp stringmodule = imp.load_module('string',*imp.find_module('string')) 3.使用exec 复制代码 代码如下: import_string = "import string as stringmodule" exec impo

python遍历 truple list dictionary的几种方法

def TestDic1(): dict2 ={'aa':222,11:222} for val in dict2: print val def TestDic2(): dict2 ={'aa':222,11:222} for (key,val) in dict2.items(): print key,":",val def TestList1(): list=[1,2,3,4,5,3,2,'ada','fs3'] for i in range(len(list)): print li

python实现每次处理一个字符的三种方法_python

本文实例讲述了python每次处理一个字符的三种方法.分享给大家供大家参考. 具体方法如下: a_string = "abccdea" print 'the first' for c in a_string: print ord(c)+1 print "the second" result = [ord(c)+1 for c in a_string] print result print "the thrid" def do_something(

调试Python程序代码的几种方法总结

  这篇文章主要介绍了调试Python程序代码的几种方法总结,文中代码基于Python2.x版本,需要的朋友可以参考下 程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug. 第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看: ? 1 2 3 4 5 6 7 8 9 10 # e

【转载】Python脚本判断一个数是否为素数的几种方法

     质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一.基于质数定义的基础之上而建立的问题有很多世界级的难题,如哥德巴赫猜想等.算术基本定理证明每个大于1的正整数都可以写成素数的乘积,并且这种乘积的形式是唯一的.这个定理的重要一点是,将1排斥在素数集合以外.如果1被认为是素数,那么这些严格的阐述就不得不加上