重新启动循环并在 python 中添加值?
Restart loop and add values in python?
问题:
有 3 条路,只有一条路通向家。
- 第一条路让你迷路了 3 天,然后你又回到了起点,你必须选择另一条路。
- 第二条路让你迷路了两天,然后你又回到了起点,你必须选择另一条路。
- 最后一扇门会在 1 天内带您回家。
基本上你一直走,直到你选择了最后一条路。我试图通过模拟 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 = +3
或a = -3
+=
是增量 a = a + 3 <=> a += 3
- 你定义了门,但从不使用它
- 你从不定义步骤,但你使用它
我觉得你应该先想出一个算法,然后再实现它。
您的代码存在一些问题。例如,您定义了一个 door
可能选项列表,然后将 path
传递给 choice
函数。在你的程序结束时你打印 steps
,但它没有在任何地方定义。相反,您应该打印 days
或 days / 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
问题:
有 3 条路,只有一条路通向家。
- 第一条路让你迷路了 3 天,然后你又回到了起点,你必须选择另一条路。
- 第二条路让你迷路了两天,然后你又回到了起点,你必须选择另一条路。
- 最后一扇门会在 1 天内带您回家。
基本上你一直走,直到你选择了最后一条路。我试图通过模拟 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 = +3
或a = -3
+=
是增量a = a + 3 <=> a += 3
- 你定义了门,但从不使用它
- 你从不定义步骤,但你使用它
我觉得你应该先想出一个算法,然后再实现它。
您的代码存在一些问题。例如,您定义了一个 door
可能选项列表,然后将 path
传递给 choice
函数。在你的程序结束时你打印 steps
,但它没有在任何地方定义。相反,您应该打印 days
或 days / 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