2
比如我有這三個選項:假設我有三個加權選擇:我如何隨機選擇一個?
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倍......)
這一個非常簡單而有效的答案; +1。此外,它不會太慢,因爲您將擁有的最大元素數量(假設權重在基於整數百分比的系統上)爲100。但是,如果權重不是百分比或者它使用分數百分比(特別是非理性)可能會變得效率低下。 – 2013-02-23 01:43:14
你可以通過分別乘以3,5和2使它更「高效」:) – Lipis 2013-02-23 01:44:40
精美簡潔。謝謝。 – user1487000 2013-02-23 02:36:30