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 回答