C# :: Aufgabe #167 :: Lösung #3

8 Lösungen Lösungen öffentlich
#167

Der Leidensweg eines Betrunkenen durch einen Tunnel

Anfänger - C# 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.
#3
3 Kommentare
2x
vote_ok
von hollst (13980 Punkte) - 13.03.2017 um 10:52 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;

namespace random_walker {
    class Program    {

        static void Main()        {

            int breite = 11, laenge = 20, max_trails = 100000;           
            bool bo_again = true;
            Random r = new Random();

            while(bo_again)            {
                int erfolgreich = 0;                
                for(var i = 0; i < max_trails; i++)                {
                    int x = 1 + breite / 2, y = 1;
                    bool bo_abbruch = false;
                    int steps = 0;
                    do                    {
                        int dir = r.Next(8);
                        steps++;
                        switch (dir)                        {
                            case 0: { y++;      break; }
                            case 1: { x--; y++; break; }
                            case 2: { x--; ;    break; }
                            case 3: { x--; y--; break; }
                            case 4: { y--;      break; }
                            case 5: { x++; y--; break; }
                            case 6: { x++;      break; }
                            case 7: { x++; y++; break; }
                        }
                        if (y == laenge + 1)
                            erfolgreich++;
                        bo_abbruch = (y == 0) || (x == 0) || (x == breite + 1) || (y == laenge + 1);
                    } while (!bo_abbruch);
                }
                ("erfolgreich: " + erfolgreich.ToString() + "  -> " + (100.0 * erfolgreich / max_trails).ToString("0.00") + " %").Message();

                "again? ESC exit".Message();
                ConsoleKeyInfo ki = ReadKey(true);
                bo_again = !(ki.Key == ConsoleKey.Escape);
            }
            "ready".EndMessage();
        }
    }

    public static class MyExtension    {
        public static void Message(this string s)
        { WriteLine(s); }

        public static void EndMessage(this string s)
        { s.Message(); ReadKey(); }
    }
}

Kommentare:

Rubbellos

Punkte: 70


2 Lösungen
3 Kommentare

#1
23.04.2017 um 15:19 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Drunk
{
    class Program
    {
        static void Main(string[] args)
        {
            HashSet<int> Count = new HashSet<int>();
            WalkingGenerator DrunkMan = new WalkingGenerator();
            int Position = 3;
            int number = 0;
            Random Step = new Random();
            Console.WriteLine("Wieviel Durchläufe?");
            int Calcnumber = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Calculating");
            for (int j = 0; j < Calcnumber; j++)
            {
                while (DrunkMan.Check(Position))
                {
                    DrunkMan.Walk(ref Position, Step.Next(0, 8));
                    if (Position > 69)
                    {
                        Count.Add(number);
                        number += 1;
                    }
                }
                Position = 3;
            }
            float rate = (float)Count.Count / (Calcnumber/100);
            Console.WriteLine("Der Man hat eine Chance durchzukommen von {0}%", rate);
            Console.ReadLine();
        }
    }
    class WalkingGenerator
    {
        public void Walk(ref int Coord, int Step)
        {
                switch(Step) {
                    case 1:
                        Coord -= 1;
                        break;
                    case 2:
                        Coord += 1;
                        break;
                    case 3:
                        Coord += 7;
                        break;
                    case 4:
                        Coord -= 7;
                        break;
                    case 5:
                        Coord += 6;
                        break;
                    case 6:
                        Coord -= 6;
                        break;
                    case 7:
                        Coord += 8;
                        break;
                    case 0:
                        Coord -= 8;
                        break;
                }
        }
        public bool Check(int Coord)
        {
            if (Coord % 7 == 0 || Coord % 7 == 6 || Coord <= 0 || Coord >= 69)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}
post_arrow
438 0

hollst

Punkte: 13980

761 Aufgaben
132 Lösungen
117 Kommentare

#2
23.04.2017 um 15:51 Uhr
Hallo,

bitte auch als Lösung einreichen, als Kommentar wird es wohl nicht gewertet.

Gruß hollst
post_arrow
439 0

Rubbellos

Punkte: 70


2 Lösungen
3 Kommentare

#3
24.04.2017 um 13:50 Uhr
Ja, dachte das es ein Kommentar zur Aufgabenstellung wäre, habe erst später gesehen das man Lösungen einreichen kann. Und hab keine Möglichkeit gefunden ihn wieder zu löschen, also trotzdem danke :)
Mfg Rubbellos
post_arrow
440 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
1797146

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.