擅长:python、mysql、java
<p>通过递增地合计项目的权重,您可以根据权重随机选择一个随机数,在[0,T)中均匀地选择一个随机数,其中T是所有权重的总和,并取第一个总权重大于该值的项目(例如二进制chop)。如果你想要一个更大的样本,你可以重复这个,或者像这样的代码对随机数进行排序,然后做一个类似于合并排序的步骤。复杂度是一样的,但是代码要简单一点,因为二进制切分总是容易出错。在</p>
<pre><code>import random
def accumulate_weights(weighted_items):
T = 0.0
for w, i in weighted_items:
T += w
yield (T, i)
def sample_weighted(weighted_items, n):
cumulative = list(accumulate_weights(weighted_items))
T = cumulative[-1][0]
i = 0
for sample in sorted(random.uniform(0, T) for _ in xrange(n)):
while sample > cumulative[i][0]:
i += 1
yield cumulative[i][1]
r = list(sample_weighted([(1.0, 'a'), (2.0, 'b'), (5.0, 'c'), (1.0, 'd')], 10000))
print [(x, r.count(x)) for x in 'abcd']
</code></pre>
<p>如果不明显,你可以用你的“比率”作为权重。当一个对象的速率为0.15,另一个对象的速率为0.3时,重要的是第二个对象的出现频率是第一个对象的两倍。这就是重量在代码中的作用!在</p>