【问题标题】:Using while loop to repeat a step of loop to reach the proper answer使用 while 循环重复一个循环步骤以达到正确的答案
【发布时间】:2018-09-29 16:04:49
【问题描述】:

我有以下代码,我只是写了它的最后一部分。由于某些原因,我们使用random.normal 值。很明显,func 函数具有三个变量。

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

【问题讨论】:

  • while(found == false) 当你得到正确答案时found = true ??
  • while Wo[i]>0 and Omo[i]<0: # calculate again ?
  • @MoeA 我这样做了,但是 Python 只是在思考,并没有打印任何东西

标签: python if-statement random while-loop


【解决方案1】:

可以使用正常的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

【讨论】:

  • 我这样做了,但 Python 只是在思考,并没有打印任何东西,break 是否重复计算?还是停下来?
【解决方案2】:

插入while 循环以重复您需要的计算。

L &gt; RWoOmo 更新为OmnWn 值时。所以如果这个值是Omn&lt;0Wn&gt;0 你需要重新计算它们。 当L &lt;= RWoOmo 是从上一次迭代中计算出来的。由于之前的迭代已经是Wo[i]&lt;=0Omo[i]&gt;=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])

【讨论】:

  • 我这样做了,但是 Python 只是在思考,并没有打印任何东西
  • 那是因为Wn[i]&gt;0 and Omn[i]&lt;0 条件永远不会满足。也许您的起始值 Wo[0] 和 Omo[0] 设置不正确?您可以尝试在is_valid 赋值之前添加print(Wn[i], Omn[i]) 来调试它。
  • 有随机数,在每次运行代码时,Om 可能有不同数量的负值。因此,我想要我的代码,因为它看到 Om 的负值重复该步骤,直到它有一个正数,然后它可以进入下一步。我卡在这部分,我不知道如何解决它
  • 我明白这一点,但如果Omo[0] = 20000 您不太可能得到Omn[i] = Omo[i-1] + 0.05 * np.random.normal() 的负数。那么,您能否提供运行的输出,在 is_valid 分配之前添加我建议您的 print
  • 我在代码中添加了一些调试打印。能否提供输出或初始化Omo[0]Wo[0]Mo[0]的方式?
猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2022-10-12
相关资源
最近更新 更多