цикл while не читает переменную - PullRequest
0 голосов
/ 04 сентября 2018
import numpy as np
def RVs():
   #s = 0
    s = 1
    f = 0
    while s!=0:
        z = np.random.random()
        if z<=0.5:
            x = -1
        else:
            x = 1
        s = s + x
        f = f + 1
    return(f)
RVs()

Код работает без сбоев, если я поставлю s=1, но так как цикл while предназначен для s!=0, если я начну с s=0, цикл даже не работает. Итак, что мне делать в этом случае, когда мне нужно запустить код для s=0. (Точнее, мне нужно, чтобы цикл while читал s=0 во второй раз.)

Ответы [ 4 ]

0 голосов
/ 04 сентября 2018

Python не имеет do .... while (), как в других языках. Так что просто используйте оператор «впервые».

import numpy as np
def RVs():
    s = 0
    t = 1 # first time in loop
    f = 0
    while s!=0 or t==1:
        t = 0 # not first time anymore
        z = np.random.random()
        if z<=0.5:
            x = -1
        else:
            x = 1
        s = s + x
        f = f + 1
return(f)
RVs()
0 голосов
/ 04 сентября 2018

Насколько я понимаю, вы пытаетесь эмулировать цикл do while, где цикл будет выполняться как минимум один раз (и вы хотите, чтобы начальное значение s было 0)

Если это так, вы можете бесконечно запускать цикл и прерывать его, если ваше условие истинно. Например:

while True:
    #code here
    if (s != 0):
        break

это запустит ваш цикл независимо от того, что хотя бы один раз, и запустит цикл снова в конце, пока ваше условие не пройдет

0 голосов
/ 04 сентября 2018

Другое решение отлично. Вот другой подход:

import numpy as np

def RVs():
    # s = 0
    s = 1
    f = 0

    while True: # will always run the first time...
        z = np.random.random()

        if z <= 0.5:
            x = -1
        else:
            x = 1

        s = s + x
        f = f + 1

        if s == 0: break # ... but stops when s becomes 0

    return(f)

RVs()

Примечание: return(f) должен содержать отступ в исходном коде, чтобы быть внутри функции RVs.

0 голосов
/ 04 сентября 2018

Попробуйте это:

import numpy as np
def RVs():
   #s = 0
    s = 1
    f = 0
    while s!=0 or f==0: #will always run it the first time
        z = np.random.random()
        if z<=0.5:
            x = -1
        else:
            x = 1
        s = s + x
        f = f + 1
    return(f)
RVs()
...