分享

#概率论# 带权随机选择

 dinghj 2013-11-22

想必我们都知道 随即选择,比如说,我们从【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。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多