假设我有三个加权选择:我如何随机选择一个?

时间:2013-02-23 01:34:05

标签: python random probability

例如,我有以下三个选项:

 Option 1
 Option 2
 Option 3

我想随机选择其中一个,但有一定的概率偏差。例如:

 Option 1: 30% chance
 Option 2: 50% chance
 Option 3: 20% chance

那么在保留python中发生的那些概率的同时随机选择一个的最佳方法是什么?

2 个答案:

答案 0 :(得分:8)

不是很有效,但很容易:

random.choice([1]*30 + [2]*50 + [3]*20)

答案 1 :(得分:5)

这有效:

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)list元素不需要加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倍......)