`
把酒泯恩仇
  • 浏览: 26439 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

根据相应概率产生随机数【太经典了】关键是简单

阅读更多

 

查看原文:

http://www.ibaiyang.org/2012/12/14/weighted-random-selection/

想必我们都知道 随即选择,比如说,我们从【1, 10】随即选择一个数,我们通常的前提是【1, 10】这10个数是等概率的,在C++里,产生这样的随即数非常简单

rand_number = rand() % 10 + 1

这样的随即算法在可以应用在 洗牌算法当中。

可是,在概率论中,统计出来的结果并没有那么理想,例如正态分布等等。

我们举一个简单的例子,例如统计成人身高,我们大家都事先的知道,这个分布一般情况是满足正在分布的,也就是说,可能如下情况:

  • p = 0.05 [150以下]
  • p = 0.2 [150 --- 160]
  • p = 0.5 [160 --- 170]
  • p = 0.2 [170 --- 175]
  • p = 0.05 [175以上]

那么现在预测一个新的成人,其身高可能落在那个区间呢,对,这就是我们今天谈到的带权随即选择,根据出现的概率来随即选择。

应用到的方法是: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/

如果您想转载本博客,请注明出处

如果您对本文有意见或者建议,欢迎留言

2
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics