2013-02-23 90 views

回答

8

效率不高,但很容易:

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

這一個非常簡單而有效的答案; +1。此外,它不會太慢,因爲您將擁有的最大元素數量(假設權重在基於整數百分比的系統上)爲100。但是,如果權重不是百分比或者它使用分數百分比(特別是非理性)可能會變得效率低下。 – 2013-02-23 01:43:14

+7

你可以通過分別乘以3,5和2使它更「高效」:) – Lipis 2013-02-23 01:44:40

+0

精美簡潔。謝謝。 – user1487000 2013-02-23 02:36:30

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)列表中的元素做不需要加起來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倍......)