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

问题描述:

问题:
有3条路径只有一条通往家。重新启动循环并在python中添加值?

  • 第一个路径让你失去了3天,然后你回到了开始你必须选择另一条路径。
  • 第二条道路让你失去了2天,然后你回到了开始,你必须选择另一条路径。
  • 最后一扇门在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循环可能工作,但我不知道如何应用它。

+1

打印 '阶梯'? 'steps'在哪里定义? “路径”在哪里定义? – TessellatingHeckler

+1

可爱的问题,但你为什么要用这个Numpy?只需直接调用'random'模块函数即可。 –

+0

如果其中一个答案解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经得到解决,让你满意,并且它可以帮助你帮助你。请参阅[此处](http://meta.stackexchange.com/a/5235)以获取完整说明。 –

您可以使用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 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) 

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

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) 
+0

小心整数除法!如果你计算total_days = 999,你会得到avg_days = 0.只需将'total_days = 0'改为'total_days = 0.0' – Stein

+1

@Stein什么整数除法?如果你在Python 2上运行它,那么这个代码将只执行整数除法。在这个时代,人们应该假设OP使用Python 3,除非他们另有说明,或者从代码中明显可见。 ;) –

+0

够公平的。可悲的是很多程序仍然需要python 2.7。 – Stein

我不是你的规则十分清楚,但是这是我尝试

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等于预计回家的天数。我们有三分之一的时间在一天之内回家,其中三分之一的时间我们在两天内回到起点,所以我们在回家之前还有d天,而我们回来的三分之一时间到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