Python :: Aufgabe #147
6 Lösungen
Der Leidensweg eines Betrunkenen durch einen Tunnel
Anfänger - Python
von hollst
- 07.03.2017 um 09:40 Uhr
Ein leicht angetrunkener Mann muss für seinen Nachhauseweg durch einen Tunnel der Länge L (z. B. = 10 m)
und der Breite B (z. B. = 5.5 m). Zum Glück ist der Tunnel mit quadratischen Terrazzoplatten ausgelegt, nach denen
er sich zu richten versucht. Die Platten haben eine Gräße von 0.5 x 0.5 m². Somit besteht der Weg aus hier z. B. 20 Reihen a 11 Platten.
Der Mann startet in der ersten Reihe auf der Mittelplatte. Er möchte durch den Tunnel gehen, indem er bei jedem
Schritt auf eine benachbarte Platte tritt. Leider hat er in seinem Zustand völlig die Richtungsorientierung verloren,
so dass sein Schritt rein zufällig in eine der acht möglichen Richtungen verläuf, unabhängig davon,
dass zwei Wände links und rechts den Weg versperren. Wenn der Mann gegen eine der Wände läuft, gilt sein Versuch
den Tunnes zu durchlaufen als gescheitert, da er bewußtlos zu Boden stürzt und liegen bleibt. Als gescheiterter Versuch gilt auch,
wenn sein Weg ihn nicht zum Tunnelausgang, sondern nach einigen Schritten oder schon bereits beim ersten zurück vor den Eingang führt.
Die Frage lautet: Wie groß ist die Wahrscheinlichkeit dafür, dass er den Tunnel mit einem einzigen Versuch schadlos durchquert?
Die Wahrscheinlichkeit (Erwartungswert) soll anhand genügend vielen Simulationen abgeschätzt werden.
und der Breite B (z. B. = 5.5 m). Zum Glück ist der Tunnel mit quadratischen Terrazzoplatten ausgelegt, nach denen
er sich zu richten versucht. Die Platten haben eine Gräße von 0.5 x 0.5 m². Somit besteht der Weg aus hier z. B. 20 Reihen a 11 Platten.
Der Mann startet in der ersten Reihe auf der Mittelplatte. Er möchte durch den Tunnel gehen, indem er bei jedem
Schritt auf eine benachbarte Platte tritt. Leider hat er in seinem Zustand völlig die Richtungsorientierung verloren,
so dass sein Schritt rein zufällig in eine der acht möglichen Richtungen verläuf, unabhängig davon,
dass zwei Wände links und rechts den Weg versperren. Wenn der Mann gegen eine der Wände läuft, gilt sein Versuch
den Tunnes zu durchlaufen als gescheitert, da er bewußtlos zu Boden stürzt und liegen bleibt. Als gescheiterter Versuch gilt auch,
wenn sein Weg ihn nicht zum Tunnelausgang, sondern nach einigen Schritten oder schon bereits beim ersten zurück vor den Eingang führt.
Die Frage lautet: Wie groß ist die Wahrscheinlichkeit dafür, dass er den Tunnel mit einem einzigen Versuch schadlos durchquert?
Die Wahrscheinlichkeit (Erwartungswert) soll anhand genügend vielen Simulationen abgeschätzt werden.
Lösungen:
Python-Code
import random random.seed() anzahl = 0 def bewegung(): global anzahl if (ende_x/platte)%2 == 0: start_x = ende_x/platte else: start_x = (ende_x+platte)/2 start_y = 0.0 while True: schritt = random.randint(1,8) if schritt == 1: start_x -= platte start_y += platte elif schritt == 2: start_y += platte elif schritt == 3: start_x += platte start_y += platte elif schritt == 4: start_x -= platte elif schritt == 5: start_x += platte elif schritt == 6: start_x -= platte start_y -= platte elif schritt == 7: start_y -= platte elif schritt == 8: start_x += platte start_y -= platte if start_x <= 0 or start_x >= ende_x or start_y < 0: break elif start_y == ende_y: anzahl += 1 break while True: ende_x = float(input("Breite Tunnel: ")) ende_y = float(input("Länge Tunnel: ")) platte = float(input("Länge quadratische Platte: ")) if ende_x%platte == 0.0 and ende_y%platte == 0.0: durchlauf = int(input("Anzahl Durchläufe: ")) for i in range(durchlauf): bewegung() break else: print("Falsche Eingabe! Platte muss Teiler von Breite und Länge des Tunnels sein!") print("Die Wahrscheinlichkeit bei",durchlauf,"Versuchen den Tunnel unbeschadet zu überqueren beträgt:",\ 100*anzahl/durchlauf,"%")
Python-Code
import random weg=[] for i in range(0,22): for j in range(0,13): weg+=[(i,j)] dic={} rand=set() ende=set() for i in weg: if i[0]==0: rand.add(i) if i[0]==21: ende.add(i) if i[1]==0 or i[1]==12: rand.add(i) else: dic[i]=[(i[0]-1,i[1]-1),(i[0]-1,i[1]),(i[0]-1,i[1]+1),(i[0]+1,i[1]+1),(i[0]+1,i[1]),(i[0]+1,i[1]+1),(i[0],i[1]+1),(i[0],i[1]-1)] def Bewegung(weg,dic,rand,ende): start=(1,6) while start not in ende: x=random.randint(0,7) start=dic[start][x] if start in rand: return False return True erfolg=0 misserfolg=0 anzahl=int(input("Bitte Anzahl der Versuche eingeben: ")) for i in range(1,anzahl+1): if Bewegung(weg,dic,rand,ende): erfolg+=1 else: misserfolg+=1 ergebnis='Insgesamt wurden '+str(anzahl)+' Versuche durchgeführt.'+\ 'Davon waren '+str(erfolg)+' erfolgreich und '+str(misserfolg)+' nicht erfolgreich\nDas ergibt eine Wahrscheinlichkeit von:\n'+ str(float(erfolg/anzahl)) print(ergebnis)
Python-Code
import numpy as np """-----------Input------------""" l = 20#int(raw_input("Länge:")) w = 11#int(raw_input("Breite:")) l= l+2 w= w+2 """-----------Functions------------""" def build_matrix(l, w): matrix = [[ 0 for i in range(w)] for j in range(l)] #finishline for i in range(len(matrix[l-1])): matrix[l-1][i] = 2 #outbound buttom for i in range(len(matrix[0])): matrix[0][i] = 3 #outbound right for i in range(len(matrix)-1): matrix[i][0] = 3 #outbound left for i in range(len(matrix)-1): matrix[i][w-1] = 3 #startingposition x,y = 1,w/2 #return matrix[x][y] = 1 return matrix, x, y #walk def walk (x, y): count = 0 while True: x1=x y1=y x = x + np.random.randint(-1,2) y = y + np.random.randint(-1,2) count = count +1 if matrix[x][y] == 0: matrix[x][y]= 1 matrix[x1][y1]= 0 elif matrix[x][y] == 2: #print "You got out" return 1 break elif matrix[x][y] == 3: #print "You hit the wall!" return 0 break """-----------Calling Functions Repeatedly------------""" reps = [] for r in range(100): m=0 while True: matrix, x, y = build_matrix(l,w) if walk(x,y)==1: break m= m+1 reps.append(m) """-----------Output------------""" #last position #print "last position:" #for i in range(len(matrix)): # print i+1,"\t", matrix[i] #tries #print "Tries:",m print reps print np.average(reps)
Python-Code
''' Created on 19.11.2017 @author: robert ''' import random number_rows_x = 20 number_rows_y = 20 number_of_trys = 1000 def get_next_step(): return [random.randint(-1,1),random.randint(-1,1)] def check_valid(pos): return pos[0] >= 1 and ( pos[1] >= 1 and pos[1] <= number_rows_y) def got_to_end(pos): return pos[0] > number_rows_x def trys(pos): while check_valid(pos): step = get_next_step() pos[0] = pos[0] + step[0] pos[1] = pos[1] + step[1] if got_to_end(pos): return 1 return 0 sums = 0 for i in range(number_of_trys): pos = [1,int(number_rows_y/2)] sums = sums + trys(pos) print('The probabilty that a drunk person gets through is ' + str(sums/float(number_of_trys)*100))
Python-Code
def tunnel_lauf(): VZ = [-1, 0, 1] LR = [-1, 0, 1] import random position_vz = 1 position_lr = 6 status = True while True: position_lr = position_lr + random.choice(LR) position_vz = position_vz + random.choice(VZ) if position_lr < 0 or position_lr > 11: status = False pos_versuch = 0 break if position_vz < 1: status = False pos_versuch = 0 break if position_vz == 11: status = False pos_versuch = 1 break return pos_versuch a = 0 for i in range(1, 10001): if tunnel_lauf() == 1: a = a + 1 print("Die Wahrscheinlichkeit, dass er aus dem Tunnel herausfindet, liegt bei etwa",a/100,"Prozent") # Es sind knapp über 4%
Python-Code
import random s_zaehler = 0 n_zaehler = 0 for i in range(0, 1000000): #startposition festlegen x = 6 y = 1 s_n = False while not s_n: #schritte gehen for i in range(0, 1): rnd_int: int = random.randint(1, 8) if rnd_int == 1: y += 1 if rnd_int == 2: y+= 1 x += 1 if rnd_int == 3: x += 1 if rnd_int == 4: x += 1 y -= 1 if rnd_int == 5: y -= 1 if rnd_int == 6: y -= 1 x -= 1 if rnd_int == 7: x -= 1 if rnd_int == 8: x -= 1 y += 1 print(rnd_int) #checken, ob sieg oder niederlage eintreten if x == 0 or x == 12 or y == 0: s_n = True n_zaehler += 1 print("n:" + str(n_zaehler)) print("s: " + str(s_zaehler)) break elif y == 20: s_zaehler += 1 s_n = True print("n:" + str(n_zaehler)) print("s: " + str(s_zaehler)) break #wahrscheinlichkeit ausgeben runden= s_zaehler + n_zaehler while runden != 100: runden = runden / 10 s_zaehler = s_zaehler / 10 try: print(s_zaehler) except ZeroDivisionError: print("0 Siege")