2

たとえば、次の 3 つのオプションがあります。

 Option 1
 Option 2
 Option 3

それらのいずれかをランダムに選択したいのですが、特定の確率バイアスがあります。例えば:

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

では、Pythonで発生する可能性を維持しながらランダムに選択するための最良のアプローチは何ですか?

4

2 に答える 2

8

あまり効率的ではありませんが、非常に簡単です。

random.choice([1]*30 + [2]*50 + [3]*20)
于 2013-02-23T01:42:18.420 に答える
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倍速くなります...)

于 2013-02-23T01:41:41.443 に答える