重新启动循环并在 python 中添加值?

Restart loop and add values in python?

问题:
有 3 条路,只有一条路通向家。

基本上你一直走,直到你选择了最后一条路。我试图通过模拟 1000 次尝试找出回家所需的平均时间。
这是我到目前为止所拥有的:

 days=0
 for i in range(1000):
     door=["a","b","c"]
     numpy.random.choice(path)
     if numpy.random.choice(path)=="a":
         days=+2
     if numpy.random.choice(path)=="b":
         days=+3       
     if numpy.random.choice(path)=="c":
         days=+1
 print(steps)

照原样,我的代码将只打印出 1-3 的值作为天数。
我无法弄清楚如何选择一个,然后将其累积到几天内,然后重新启动循环,直到它选择路径 C。
我做过研究,认为 while 循环可能有效,但我不知道如何应用它。

这是您要查找的代码:

import numpy

def runOnce():
    days = 0
    door=["a","b","c"]
    while(True):
        path = numpy.random.choice(door)
        if path=="a":
            days+=2

        if path=="b":
            days+=3

        if path=="c":
            days+=1
            return days
total = 0
for i in range(1000):
    total += runOnce()

print(total / 1000.0)

你可以使用一个 while 循环,在你被卡住的时候不断迭代,然后当门 'a' 被选中时,它会添加 1 回家,但是这个人不再被卡住,所以它会退出while 循环。然后在再次进入 while 循环之前,只需设置 stuck = True 并且该过程继续始终添加到总天数,然后在最后取平均值。

import numpy

days=0
door=["a","b","c"]

N = 1000
for i in range(N):
    stuck = True

    while stuck:
        if numpy.random.choice(door)=="a":
            days += 2

        if numpy.random.choice(door)=="b":
            days += 3

        if numpy.random.choice(door)=="c":
            days += 1
            stuck = False

print('Average number of days taken to get home: ', days / N)

希望对您有所帮助!

此代码必须解决您的问题:

import random

doors = ['a', 'b', 'c']
total_days = 0
runs = 1000
for i in range(runs):
    days = 0
    choice = None

    while choice != 'c':
        choice = random.choice(doors)
        if choice == 'a': 
            days += 2
        if choice == 'b':
            days += 3
        if choice == 'c':
            days += 1
    total_days += days
avg_days = total_days / runs
print(avg_days)

我不太确定你的规则,但这是我的尝试

import numpy as np

def choose_path():
    p =np.random.randint(3)
    #print("Path = {}".format(p))
    return p


N = 100000

days=0.0
for i in range(N):
    #make sure you don't take the wrong path twice
    taken = [False, False, False]

    path = choose_path()
    while(path != 2):
        if(path==0):
            if(not(taken[path])):
                taken[path] = True
                days += 2.0

        if(path==1):
            if(not(taken[path])):
                taken[path] = True
                days += 3.0

        path = choose_path()
    days += 1.0
   # print("Days = {}".format(days))

print("Average for {} iterations = {}".format(N, days/N))

与其他一些代码相比,我的人不会两次走同一条路线。我不确定你的问题是如何定义的。我的解决方案似乎是 3.5。 你犯的一些错误是:

  • =+是正数的赋值a = +3a = -3 += 是增量 a = a + 3 <=> a += 3
  • 你定义了门,但从不使用它
  • 你从不定义步骤,但你使用它

我觉得你应该先想出一个算法,然后再实现它。

您的代码存在一些问题。例如,您定义了一个 door 可能选项列表,然后将 path 传递给 choice 函数。在你的程序结束时你打印 steps,但它没有在任何地方定义。相反,您应该打印 daysdays / 1000。编程时需要注意这些!

如其他人所示,您需要使用两个循环来执行此操作。外循环的每次迭代都执行一次试验。内部循环选择路径直到您回家并将天数添加到当前总数。

在您的代码中,每个 if 测试都会在您在循环开始时所做的选择之上生成一个新的随机选择。那是不对的。只需在循环顶部做出选择,确定要添加多少天,如果你在家,就跳出循环。

我们可以用更简单的方法来做到这一点。不要从 'a'、'b' 或 'c' 中选择,只需从 1、2 或 3 中选择,即每条路径所花费的天数。正如我之前所说,不需要为此使用 Numpy,我们可以直接调用 random 模块函数,而不是让 Numpy 为我们做。

这是一个简短的演示。

from random import randint

trials = 10000
days = 0
for n in range(trials):
    while True:
        path = randint(1, 3)
        days += path
        if path == 1:
            break

print(days, days / trials)

典型输出

59996 5.9996

我们可以通过执行多次运行并对结果进行平均来更准确地估计真实的预期时间。我们可以通过将之前的代码包装在一个额外的循环中来做到这一点,但如果我们将旧代码包装在一个函数中,并在一个循环中调用该函数,它会使代码更具可读性。像这样:

from random import randint

def sim(trials):
    days = 0
    for n in range(trials):
        while True:
            path = randint(1, 3)
            days += path
            if path == 1:
                break
    return days

num = 10
trials = 10000
total = 0
for i in range(num):
    days = sim(trials)
    x = days / trials
    print(i, x)
    total += x

print('Final', total / num)

典型输出

0 5.9732
1 6.007
2 6.0555
3 5.9943
4 5.9964
5 5.9514
6 6.0689
7 6.0457
8 5.9859
9 5.9685
Final 6.00468

看起来真实的预期值为 6 天。其实,数学上并不难证明。

设 d 等于预计到家的天数。我们有 1/3 的时间在 1 天内回到家,有 1/3 的时间我们在 2 天内回到起点所以我们还有 d 天才能回家,还有 1/3 的时间我们回来3 天后开始,所以,我们还有 d 天才能回家。

我们可以将其转化为等式:

d = (1/3)*1 + (1/3)*(2 + d) + (1/3)*(3 + d)
3*d = 1 + 2 + d + 3 + d
3*d = 6 + 2*d
d = 6