例如,我有这三个选项:
Option 1
Option 2
Option 3
我想随机选择其中一个,但有一定的概率偏差。例如:
Option 1: 30% chance
Option 2: 50% chance
Option 3: 20% chance
那么在保留它们在 python 中发生的概率的同时随机选择一个的最佳方法是什么?
例如,我有这三个选项:
Option 1
Option 2
Option 3
我想随机选择其中一个,但有一定的概率偏差。例如:
Option 1: 30% chance
Option 2: 50% chance
Option 3: 20% chance
那么在保留它们在 python 中发生的概率的同时随机选择一个的最佳方法是什么?
效率不高,但很容易:
random.choice([1]*30 + [2]*50 + [3]*20)
这有效:
import random
def weighted_choice(weights):
choice = random.random() * sum(weights)
for i, w in enumerate(weights):
choice -= w
if choice < 0:
return i
weighted_choice([.3, .5, .2]) # returns 0,1,2 in proportion to the weight
要测试它:
import collections
c = collections.Counter()
n = 1000000
for i in range(n):
c[weighted_choice([.3, .5, .2])] += 1
for k, v in c.items():
print '{}: {:.2%}'.format(k,float(v)/n)
印刷:
0: 30.11%
1: 50.08%
2: 19.81%
除了相当快之外,优点是 1) 列表元素不需要加起来 1 或 100,2) 更多选择,只需向列表中添加更多元素:
for i in range(n):
c[weighted_choice([.3,.35,.1,.1,.15,.4])]+=1
印刷:
0: 21.61%
1: 25.18%
2: 7.22%
3: 7.03%
4: 10.57%
5: 28.38%
(根据接受的答案计时,它快了大约 2 倍......)