我有一个单词列表
count=100
list = ['apple','orange','mango']
对于上面使用随机函数的计数,是否有可能选择40%的苹果时间,30%的橙色时间和30%的时间芒果?
代表:
for the count=100, 40 times apple, 30 times orange and 30 times mango.
此选择必须随机发生
答案 0 :(得分:5)
根据对generating discrete random variables with specified weights问题的回答,您可以使用numpy.random.choice
获得比使用random.choice
快20倍的代码:
from numpy.random import choice
sample = choice(['apple','orange','mango'], p=[0.4, 0.3, 0.3], size=1000000)
from collections import Counter
print(Counter(sample))
输出:
Counter({'apple': 399778, 'orange': 300317, 'mango': 299905})
更不用说它实际上比“以所需比例构建列表然后随机播放”更容易。
此外,随机播放总会产生完全 40%的苹果,30%的橙子和30%的芒果,这与根据离散概率分布生成“百万水果样本”的说法不同。后者是两个choice
解决方案所做的(以及bisect
)。如上所示,使用numpy
时,约有 40%苹果等。
答案 1 :(得分:4)
最简单的方法是以所需的比例建立一个列表,然后将其洗牌。
>>> import random
>>> result = ['apple'] * 40 + ['orange'] * 30 + ['mango'] * 30
>>> random.shuffle(result)
编辑计数真正为1,000,000的新要求:
>>> count = 1000000
>>> pool = ['apple'] * 4 + ['orange'] * 3 + ['mango'] * 3
>>> for i in xrange(count):
print random.choice(pool)
更慢但更通用的替代方法是bisect和cumulative probability distribution:
>>> import bisect
>>> choices = ['apple', 'orange', 'mango']
>>> cum_prob_dist = [0.4, 0.7]
>>> for i in xrange(count):
print choices[bisect.bisect(cum_prob_dist, random.random())]