Python :: Aufgabe #147

6 Lösungen Lösungen öffentlich

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.

Lösungen:

1 Kommentar
vote_ok
von jigga (4260 Punkte) - 08.03.2017 um 10:24 Uhr
Quellcode ausblenden 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,"%")
vote_ok
von 0 (0 Punkte) - 16.09.2017 um 07:31 Uhr
Quellcode ausblenden 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) 
 
1x
vote_ok
von frfrey (370 Punkte) - 29.10.2017 um 15:46 Uhr
Quellcode ausblenden 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)

vote_ok
von ZRX88 (2770 Punkte) - 19.11.2017 um 12:32 Uhr
Quellcode ausblenden 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))
vote_ok
von satn1241 (3090 Punkte) - 07.04.2020 um 12:24 Uhr
Quellcode ausblenden 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%
vote_ok
von Des_ORNTRT (530 Punkte) - 02.05.2020 um 18:20 Uhr
Quellcode ausblenden 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")
1810112

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.