choices = [a,a,a,a,b,b,c]
random.choice(choices)
从结果可以看出a最有可能被选中,但是否有更好/更短的方法来完成这个任务?
choices = [a,a,a,a,b,b,c]
random.choice(choices)
从结果可以看出a最有可能被选中,但是否有更好/更短的方法来完成这个任务?
choices
而不是choice
,则可以为每个元素指定权重。random.choices([a,b,c], [4,2,1])
a
大约两倍于b
,大约四倍于c
。>>> import collections, random
>>> collections.Counter(random.choices('abc', [4,2,1], k=100))
Counter({'a': 58, 'b': 25, 'c': 17})
random.choice('abc')
有1/3的概率返回 a
、b
或 c
。random.choices('abc', [4,2,1])
将在7次选择中选择 a
4 次,b
2 次,c
1 次。它仍然是随机的,但不是均匀分布。 - chepner如果您没有使用Python 3.6+(支持random.choices
中权重),您可以构建一个种群:
import random
a, b, c = 'abc'
weighted = [(a, 4), (b, 2), (c, 1)]
population = [x for x, weight in weighted for _ in range(weight)]
random.choice(population)
如果您担心大权重值的性能问题,可以使用 itertools.accumulate
和 bisect
:
import bisect
import itertools
import random
choices = ['a', 'b', 'c']
weights = [4, 2, 1]
cumulative_weights = list(itertools.accumulate(weights))
print(choices[bisect.bisect(cumulative_weights, random.random() * cumulative_weights[-1])])
a,a,a,a,a,a,a,a,a,a,a
... - iz_
[a,b,c]
中选择,但不是均匀地选择吗? - chepner