使用while循环重复循环的一个步骤以达到正确的ans

2024-09-28 01:31:58 发布

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

我有下面的代码,我只是写它的最后一部分。出于某些原因,我们使用random.normal值。很明显,func函数有三个变量。你知道吗

我的问题是:计算的步骤是101,而输出中的每个参数都有100值。如果您看到Wo[i]>0Omo[i]<0,我应该如何告诉Python重新计算该步骤(这将使用另一个随机数),直到得到正确的答案(Wo[i]<0 and Omo[i]>0。你知道吗

我们必须这样做,因为如果我们打印输出,然后删除那些不满足条件的值,例如,我们有60个值而不是100个值。我知道我们可以用while loop,但我不知道怎么用。你知道吗

N=101
for i in range (1,N):
    R=np.random.uniform(0,1)

    Omn[i] = Omo[i-1] + 0.05 * np.random.normal()
    Wn[i] = Wo[i-1] + 0.05 * np.random.normal()
    Mn[i] = Mo[i-1] + 0.1 * np.random.normal()

    L = exp(-0.5 * ( func(Omn[i], Wn[i], Mn[i] ) - func( Omo[i-1], Wo[i-1], Mo[i-1] )))

    if L>R:
        Wo[i]=Wn[i]
        Mo[i]=Mn[i]
        Omo[i]=Omn[i]

    else:
        Wo[i]=Wo[i-1]
        Mo[i]=Mo[i-1]
        Omo[i]=Omo[i-1]

    print(Wo[i],Mo[i],Omo[i])

Tags: 函数代码np步骤原因randommofunc
2条回答

您可以使用普通while循环并在计算后检查条件,例如:

for i in range (1,N):
    R=np.random.uniform(0,1)
    while True:
        Omn[i] = Omo[i-1] + 0.05 * np.random.normal()
        Wn[i] = Wo[i-1] + 0.05 * np.random.normal()
        Mn[i] = Mo[i-1] + 0.1 * np.random.normal()
        if Wo[i] <= 0 and Omo[i] >= 0:
            break
    # rest of code

插入while循环以重复所需的计算。你知道吗

L > RWoOmoOmnWn值更新时。所以如果这个值是Omn<0或者Wn>0,你需要重新计算它们。 从上一次迭代计算L <= RWoOmo时。因为上一次迭代已经是Wo[i]<=0Omo[i]>=0,所以不需要重复这些计算。你知道吗

因此,如下面的代码所示,您只需要重新计算Omn和Wn变量:

Omo[0] = 0.24
Wo[0] = -0.2
Mo[0] = 1.0

N = 101
for i in range (1,N):
    is_valid = False
    if __debug__:
        print "Calculating position " + str(i)
    while (not is_valid):
        Omn[i] = Omo[i-1] + 0.05 * np.random.normal()
        Wn[i] = Wo[i-1] + 0.05 * np.random.normal()
        Mn[i] = Mo[i-1] + 0.1 * np.random.normal()

        if __debug__:
            print "- is_valid iteration values: " + str(Wn[i]) + " " + str(Omn[i])
            print "- is_valid previous values: " + str(Wo[i-1]) + " " + str(Omo[i-1])

        is_valid = Omn[i] >= 0 and Wn[i] <= 0 

    R = np.random.uniform(0,1)
    L = exp(-0.5 * ( func(Omn[i], Wn[i], Mn[i] ) - func( Omo[i-1], Wo[i-1], Mo[i-1] )))

    if L > R:
        Omo[i] = Omn[i]
        Wo[i] = Wn[i]
        Mo[i] = Mn[i]
    else:
        Omo[i] = Omo[i-1]
        Wo[i] = Wo[i-1]
        Mo[i] = Mo[i-1]

    print(Wo[i], Mo[i], Omo[i])

相关问题 更多 >

    热门问题