这是Python cookbook的示例

1 def random_pick(some_list,probabilities):
2   x=random.uniform(0,1)
3   cumulative_probability=0.0
4   for item,item_probability in zip(some_list,probabilities):
5     cumulative_probability+=item_probability
6     if x < cumulative_probability: break
7   return item

什么意思呢?

random.uniform(0,1)->生成0.0到1.0之间的伪随机数,之后循环元素及其概率,计算累积概率.

如:random_pick([1,2,3,4],[0.1,0.2,0.3,0.4])

当x处于0.0到0.1之间,则输出1

当x处于0.1到0.3之间,则输出2

...........

在这里可以做个测试:

def test_random(nu):
a=[1,2,3,4]
b=[0.1,0.2,0.3,0.4]
re=dict(zip(a,[0]*4))
for x in xrange(nu):
result=random_pick(a,b)
re[result]+=1
for v,value in re.iteritems():
re[v]=float(value)/nu
return re
print test_random(100000)

结果:

{1: 0.099250000000000005, 2: 0.19950999999999999, 3: 0.30030000000000001, 4: 0.40094000000000002}

另一个有点类似的任务是根据一个非负整数的序列所定义的权重进行随机撷取---基于机会,而不是概率

import random
def random_picks(sequence,relative_odds):
  table=[z for x,y in zip(sequence,relative_odds) for z in [x]*y]
  while True:
    yield random.choice(table) x=random_picks('ciao',[1,1,3,2])
import itertools
print ''.join(itertools.islice(x,8))

输出:

oooocaco

这里我们也做个测试:

result=''.join(itertools.islice(x,100000))
c=result.count('c')
i=result.count('i')
a=result.count('a')
o=result.count('o')
min=min(c,i,a,o)
print float(c)/min,':',float(i)/min,':',float(a)/min,':',float(o)/min

输出:

1.0 : 1.0210748156 : 3.00316122234 : 2.00070249385

这两个例子有什么区别呢?

第一个例子要求som_list的长度和probabilities的长度一致,以及所有元素的概率相加为1.0

而第二个例子需要非负整数.

Python 以指定概率获取元素的更多相关文章

  1. python 动态指定header获取网页源代码的函数

    import random import requests def get_htmla(url): aui=0 while aui==0: try: header={'User-Agent':'Moz ...

  2. Python 以指定的概率选取元素

    Python 以指定的概率选取元素 Problem You want to pick an item at random from a list, just about as random.choic ...

  3. python selenium 练习 自动获取豆瓣阅读当前特价书籍 chrome 元素定位 窗口切换 元素过期

    豆瓣原创电子书每周推出数十本限时免费数目,一周免费期过后恢复原价.想着豆瓣原创书中有不少值得一看,便写了个脚本,免去一个个添加的烦恼. 使用了Windows下selenium+Python的组合,有较 ...

  4. python指定概率随机取值 理解np.random.seed()

    python指定概率随机取值参考如下: 下面是利用 np.random.choice()指定概率取样的例子: np.random.seed(0) p = np.array([0.1, 0.0, 0.7 ...

  5. 用 getElementsByTagName() 来获取,父元素指定的子元素

    1. html 结构 <ul> <li>知否知否,应是等你好久11</li> <li>知否知否,应是等你好久11</li> <li&g ...

  6. python中的enumerate获取迭代元素的下标

    以前迭代的时候,需要获取次数都是如下格式: index=1 for node in nodes: if index==3: continue print(node.text_content())ind ...

  7. 原生js来写获取元素距离顶部距离,以及滚动条滚动指定距离和时间控制

    这是我在写vue项目里封装的一个公共js类 里面还有一些其他的方法,一并拿过来了 class Public { isDesktop(){ //判断是否为pc端 return (window.scree ...

  8. Python+Appium自动化测试(11)-location与size获取元素坐标

    appium做app自动化测试过程中,有时需要获取控件元素的坐标进行滑动操作.appium中提供了location方法获取控件元素左上角的坐标,再通过size方法获取控件元素的宽高,就可以得到控件元素 ...

  9. appium+python自动化:获取元素属性get_attribute

    使用get_attribute()获取元素属性,括号里应该填写什么? 查看appium源码 如果是获取resource-id,填写resourceId self.driver.find_element ...

随机推荐

  1. SQL经典问题 找出连续日期及连续的天数

    转自:http://bbs.csdn.net/topics/360019248 如何取到每段连续日期的起始终止日期以及持续天数及起始日期距上一期终止日期的天数,能否用一句sql实现?备注:数据库环境是 ...

  2. JSP 中的几种注释

    1.多行注释 <!-- 注释1 注释2 注释3 --> 或者 <!-- 注释1 …… 注释n //--> 2.多行注释,不同的是:注释内容不会发送到客户端,会被JSP引擎所忽略 ...

  3. NDK(11)Android.mk编译APK模板

    转自 :  http://hubingforever.blog.163.com/blog/static/1710405792011656434982/ 以下仅是使用Android.mk编译APK程序的 ...

  4. JSON(3)Google解析Json库Gson

    本文参考 : http://www.cnblogs.com/chenlhuaf/archive/2011/05/01/gson_test.html 1.资料 官网: http://groups.goo ...

  5. 总结Selenium自动化测试方法(四)WebDriver常用的操作

    四.WebDriver常用的操作 1.控制浏览器操作 #控制浏览器的大小 self.driver.set_window_size(480,800) #控制浏览器返回 self.driver.back( ...

  6. leetcode:Swap Nodes in Pairs

    Given a linked list, swap every two adjacent(相邻的) nodes and return its head. For example,Given 1-> ...

  7. Java好文统计( 引用 )

    1. java 关于类的路径及编译问题 windows 版本:http://www.ibm.com/developerworks/cn/java/j-classpath-windows/ unix & ...

  8. SOCKSify Ruby

    http://socksify.rubyforge.org/ What is it? SOCKSify Ruby redirects any TCP connection initiated by a ...

  9. 从svn检出的项目如何编译

    从svn检出的项目如何编译   svn检查项目后,不能构建编译 工程右键,bulid path -->No actions available   问题:svn检查项目后,发现没有class文件 ...

  10. SVN功能详解

    SVN功能详解   TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. ...