查看原文:
http://www.ibaiyang.org/2012/12/14/weighted-random-selection/
想必我们都知道 随即选择,比如说,我们从【1, 10】随即选择一个数,我们通常的前提是【1, 10】这10个数是等概率的,在C++里,产生这样的随即数非常简单
rand_number = rand() % 10 + 1
这样的随即算法在可以应用在 洗牌算法当中。
可是,在概率论中,统计出来的结果并没有那么理想,例如正态分布等等。
我们举一个简单的例子,例如统计成人身高,我们大家都事先的知道,这个分布一般情况是满足正在分布的,也就是说,可能如下情况:
那么现在预测一个新的成人,其身高可能落在那个区间呢,对,这就是我们今天谈到的带权随即选择,根据出现的概率来随即选择。
应用到的方法是:Fitness_proportionate_selection
def weighted_choice_sub(weights): rnd = random.random() * sum(weights) for i, w in enumerate(weights): rnd -= w if rnd < 0: return i
其中返回的结果是weights相应的索引。
经过测试:
import random from collections import Counter nr_data = 1000000 weights = [0.05, 0.2, 0.5, 0.2, 0.05] count = Counter() for x in xrange(nr_data): index = weighted_choice_sub(weights) count[index] += 1 count_sum = sum( count.values() ) for key, value in count.iteritems(): print float(value) / count_sum
得出的结果是:
>>> 0.049853 0.199878 0.499906 0.200211 0.050152 >>>
挺符合的。白杨到此一游!Enjoy It。
-----------------打造高质量的文章 更多关注 把酒泯恩仇---------------
为了打造高质量的文章,请 推荐 一下吧。。。。谢谢了,请关注我后续的文章,会更精彩哦
请关注sina微博:http://weibo.com/baiyang26
把酒泯恩仇官方博客:http://www.ibaiyang.org 【推荐用google reader订阅】
把酒泯恩仇官方豆瓣:http://www.douban.com/people/baiyang26/
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言