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