2017-10-13 40 views
2

問題:
有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)以獲取完整說明。 –

回答

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) 

我希望這有助於!

0

這裏就是你要找的代碼:

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

0

我不是你的規則十分清楚,但是這是我嘗試

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
  • 你定義的門,但從來沒有使用它
  • 你從來沒有定義的步驟但你用它

我認爲你應該想出一個算法,然後實現它。

0

您的代碼有幾個問題。例如,您可以定義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