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

 

查看原文:

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/

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值