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:
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,"%")
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)
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)
'''
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))
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%
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")
