查看原文:
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/
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言
分享到:
相关推荐
产生随机数并运算产生随机数并运算产生随机数并运算产生随机数并运算产生随机数并运算产生随机数并运算
用单片机产生随机数的两种方法。
使用tcl脚本产生随机数
Keil C51 中产生随机数的方法和样例
汇编语言 产生随机数并运算 汇编语言 产生随机数并运算
混合同余法产生随机数和M序列产生方法(算例及matlab程序),参考文献《过程辨识》,方崇智,肖德云,清华大学出版社
利用移位寄存器产生均匀随机数,再利用Box-Muller产生高斯随机数。
这个程序能产生一定的概率的随机数。 在小样本的情况下是看不出来的,但是样本个数到一定程度时,会发现完全符合概率的分布。
随机数随机数随机数随机数随机数随机数随机数随机数
用c语言产生随机数.doc 用c语言产生随机数.doc 用c语言产生随机数.doc 用c语言产生随机数.doc 用c语言产生随机数.doc 用c语言产生随机数.doc 用c语言产生随机数.doc 用c语言产生随机数.doc 用c语言产生随机数.doc 用...
产生随机数的摇奖机产生随机数的摇奖机产生随机数的摇奖机
系统辨识中利用乘同余法产生服从0,1分布的随机数
JAVA 生成随机数,并根据概率、比率,通过返回数字来判断中奖情况
收集的一些常见c随机数算法实例 !免积分
产生随机数.rar产生随机数.rar产生随机数.rar产生随机数.rar产生随机数.rar产生随机数.rar
利用Mersenne Twister算法产生随机数,并测试和分析了其随机性。 程序中还加入了界面显示。 各个文件为: initGenerator.m: initGenerator函数,用于初始化随机序列的长度和值 generateNum.m: generateNum函数,当...
介绍java 产生随机数式介绍java 产生随机数式介绍java 产生随机数式介绍java 产生随机数式
这是C语言中,关于随机数的产生的方法,方法较简单
……rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于...
C语言线性同余法产生随机数 一个简单的例子:a=7, c=1, m=13, and seed=5 一个复杂的例子:a=69069, c=0, m=2^32=4294967296, seed=31