0
from random import uniform

prob = [0.25,0.30,0.45]

def onetrial(prob):
    u=uniform(0,1)
    if 0 < u <= prob[0]:
        return 11
    if prob[0] < u <= prob[0]+prob[1]:
        return 23
    if prob[0]+prob[1] < u <= prob[0]+prob[1]+prob[2]:
        return 39

print onetrial(prob)

いくつかの for ループ手法を使用して、def の反復部分を減らす方法を知りたいです。ありがとう。

4

3 に答える 3

1

以下は現在のコードと同等であり、forループを使用します。

from random import uniform

prob = [0.25, 0.30, 0.45]

def onetrial(prob):
    u = uniform(0, 1)
    return_values = [11, 23, 39]
    total_prob = 0
    for i in range(3):
        total_prob += prob[i]
        if u <= total_prob:
            return return_values[i]

返される値と確率の関係については少しわかりません。コードprobには常に正確に3つの要素があるように思われるので、その仮定も行いました。

于 2012-05-15T22:41:42.150 に答える
1

私はFJの答えが好きですが、簡単にできると仮定して、タプルのリストを使用します。

from random import uniform

prob = [(0.25, 11), (0.30, 23), (0.45, 39)]

def onetrial(prob):
    u = uniform(0, 1)
    total_prob = 0
    for i in range(3):
        total_prob += prob[i][0]
        if u <= total_prob:
            return prob[i][1]
于 2012-05-15T22:45:16.837 に答える
0

onetrial頻繁に呼び出すと仮定すると、最初にCDFを計算して少し速くします。

from random import uniform

vals = [11, 23, 39]
prob = [0.25, 0.30, 0.45]
cdf = [sum(prob[0:i+1]) for i in xrange(3)]

def onetrial(vals, cdf):
    u = uniform(0, 1)
    for i in range(3):
        if u <= cdf[i]:
            return vals[i]

bisectを使用して、さらに高速にすることができます。

于 2012-05-15T23:01:22.713 に答える