在Python中的for循环和重复计算

2024-05-23 20:09:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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中的重复部分。谢谢。在


Tags: fromimportforreturnifdefrandomuniform
3条回答

假设您经常调用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使其更快。在

我喜欢F.J.的回答,但我会使用元组列表,假设您可以轻松做到:

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]

以下代码与当前代码等效,它使用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个元素,所以我也做了这个假设。在

相关问题 更多 >