Python 以指定概率获取元素
这是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 以指定概率获取元素的更多相关文章
- python 动态指定header获取网页源代码的函数
import random import requests def get_htmla(url): aui=0 while aui==0: try: header={'User-Agent':'Moz ...
- Python 以指定的概率选取元素
Python 以指定的概率选取元素 Problem You want to pick an item at random from a list, just about as random.choic ...
- python selenium 练习 自动获取豆瓣阅读当前特价书籍 chrome 元素定位 窗口切换 元素过期
豆瓣原创电子书每周推出数十本限时免费数目,一周免费期过后恢复原价.想着豆瓣原创书中有不少值得一看,便写了个脚本,免去一个个添加的烦恼. 使用了Windows下selenium+Python的组合,有较 ...
- python指定概率随机取值 理解np.random.seed()
python指定概率随机取值参考如下: 下面是利用 np.random.choice()指定概率取样的例子: np.random.seed(0) p = np.array([0.1, 0.0, 0.7 ...
- 用 getElementsByTagName() 来获取,父元素指定的子元素
1. html 结构 <ul> <li>知否知否,应是等你好久11</li> <li>知否知否,应是等你好久11</li> <li&g ...
- python中的enumerate获取迭代元素的下标
以前迭代的时候,需要获取次数都是如下格式: index=1 for node in nodes: if index==3: continue print(node.text_content())ind ...
- 原生js来写获取元素距离顶部距离,以及滚动条滚动指定距离和时间控制
这是我在写vue项目里封装的一个公共js类 里面还有一些其他的方法,一并拿过来了 class Public { isDesktop(){ //判断是否为pc端 return (window.scree ...
- Python+Appium自动化测试(11)-location与size获取元素坐标
appium做app自动化测试过程中,有时需要获取控件元素的坐标进行滑动操作.appium中提供了location方法获取控件元素左上角的坐标,再通过size方法获取控件元素的宽高,就可以得到控件元素 ...
- appium+python自动化:获取元素属性get_attribute
使用get_attribute()获取元素属性,括号里应该填写什么? 查看appium源码 如果是获取resource-id,填写resourceId self.driver.find_element ...
随机推荐
- eclipse运行mapreduce报错Permission denied
今天用在eclipse-hadoop平台上运行map reduce(word count)出错了,错误信息为 org.apache.hadoop.security.AccessControlExcep ...
- hdu 4565 So Easy!(矩阵+快速幂)
题目大意:就是给出a,b,n,m:让你求s(n); 解题思路:因为n很可能很大,所以一步一步的乘肯定会超时,我建议看代码之前,先看一下快速幂和矩阵快速幂,这样看起来就比较容易,这里我直接贴别人的推导, ...
- [2014-03-13 08:46:42 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace. 问题提示 ...
- 虚拟机 主机无法访问虚拟机中Linux上的tomcat服务
在wmware中安装linux后安装好数据库,JDK及tomcat后启动服务,虚拟机中可以访问,但是主机却无法访问,但是同时主机和虚拟机之间可以ping的通,网上查阅资料后,解决方法是关闭虚拟机中的防 ...
- Android ListView不响应OnItemClickListener解决办法
有时候,当ListView中的每一个item是自定义的View时,有可能会导致ListView的OnItemClickListener的listener无法调用,请看如下情况: 如果你的自定义List ...
- python-unexpected content storage modification出错
提示以上错误,然后在pycharm中的文件内容和实际内容不一致 去我的文档-.PyCharm-system_cache,全部删除
- Trianglify – 五彩缤纷的 SVG 背景图案
Trianglify 是一个能够生成五颜六色的三角形图案的 JavaScript 库,可以用来作为 SVG 图像和 CSS 背景.它的灵感来自于 Btmills 的 Geopattern,并使用 d3 ...
- Web Forms vs Web MVC
MVC相对于WebForm来说更难学习,但性能优于WebForm,比较适合大型项目,开发成本较高,但耦合度低,易于维护,没有太多的现成控件,开发效率较低.对WebForm有基础的人反而不太容易学MVC ...
- Windows bat with adb
/********************************************************************* * Windows bat with adb * 说明: ...
- 【英语】Bingo口语笔记(44) - 进餐时的表达