0

重複の可能性:
random.choiceの加重バージョン

簡単にするために、関数が4つの入力を受け取るとしましょう:2つの名前とそれぞれの「バイアス/重み」、関数がどちらかaまたはbランダムに返されるが、それらの重みをランダムな結果に考慮するように関数を作成するにはどうすればよいですか?

a = 'x'
b = 'y'
p_a = 10
p_b = 90

def myRand(a, p_a, b, p_b):
    return 'x' 10% of the time, 'y' 90% of time

私がこれまでにしたこと

import random

def myRand(a, p_a, b, p_b):
    probs = [a]*p_a + [b]*p_b
    return random.choice(probs)

誰かがこれが間違っている、または最良の答えではない理由を指摘できますか?私の正当な理由は、すべての要素が同じ確率で選択されると想定しているため、結果は10:90を優先するはずです。または、使用する前にアレイをシャッフルできrandom.choice()ますか?

これを行うためのより良い方法はありますか?たぶん私はここで明白な何かを見逃していますか、それともこれは正しいですか?

ありがとう

4

3 に答える 3

1

これにより、あなたがやろうとしていることを達成できます:

#assumes p_a and p_b are both positive numbers that sum to 100
def myRand(a, p_a, b, p_b):
   return a if random.uniform(0,100) < p_a else b 

p_b は、重みが 2 つしかない特殊なケースでは不要になることに注意してくださいp_b == 100-p_a

于 2012-08-23T17:15:32.640 に答える
1

任意の数の入力と加重確率を受け入れるように関数を変更したので、後で 3 つ以上の入力を使用することにした場合でも使用できます。

import random

def myRand(i, w):
    r = random.uniform(0, sum(w))

    # loop through a list of inputs and max cutoff values, returning
    # the first value for which the random num r is less than the cutoff value
    for n,v in map(None, i,[sum(w[:x+1]) for x in range(len(w))]):
        if r < v:
            return n

使用例:

inputs = ['e', 'f', 'g', 'h']
weights = [10, 30, 50, 10]

print myRand(inputs, weights)
于 2012-08-23T18:42:38.393 に答える
0

a = 'x';b = 'y';p_a = 10;p_b = 90

比率 = p_a + pb = 100

0 から 100 の間の乱数を生成し、その数が 10 未満の場合は a=>x を使用し、それ以外の場合は b=>y を使用します

于 2012-08-23T17:16:24.870 に答える