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

6 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.
#4
3 Kommentare
vote_ok
von Rubbellos (70 Punkte) - 23.04.2017 um 15:21 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;
            }
        }
    }
}

Kommentare:

hollst

Punkte: 7130

360 Aufgaben
72 Lösungen
65 Kommentare

#1
24.04.2017 um 15:30 Uhr
Hallo Rubbelos,

da Dein Rechenergebnis wesentlich von dem der anderen Lösungen abweicht, habe ich mir Deinen Code etwas genauer angesehen.

Check einmal bitte dieses (die auskommentierten Zeilen wurden durch mich mit der darunter liegenden Zeile ersetzt, außerdem habe ich noch eine Wiederholungsschleife (while (!bo_exit)) eingebaut):

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)
        {
            Random Step = new Random();
            bool bo_exit = false;
            while (!bo_exit)
            {
                HashSet<int> Count = new HashSet<int>();
                WalkingGenerator DrunkMan = new WalkingGenerator();
                //int Position = 3;
                int Position = 7;
                int number = 0;
                
                //Console.WriteLine("Wieviel Durchläufe?");
                //int Calcnumber = Convert.ToInt32(Console.ReadLine());

                int Calcnumber = 100000;
                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)
                        if (Position > 260)
                        {
                            Count.Add(number);
                            number += 1;
                            break;
                        }
                    }
                    //Position = 3;
                    Position = 7;
                }
                float rate = (float)Count.Count / (Calcnumber / 100);
                Console.WriteLine("{1} {2}   Der Man hat eine Chance durchzukommen von {0}%", rate, Count.Count, Calcnumber);

                Console.WriteLine("again? exit ESC");
                ConsoleKeyInfo ki = Console.ReadKey(true);
                bo_exit = ki.Key == ConsoleKey.Escape;
            }
            //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;
                    Coord += 13;
                    break;
                case 4:
                    //Coord -= 7;
                    Coord -= 13;
                    break;
                case 5:
                    //Coord += 6;
                    Coord += 14;
                    break;
                case 6:
                    //Coord -= 6;
                    Coord -= 14;
                    break;
                case 7:
                    //Coord += 8;
                    Coord += 12;
                    break;
                case 0:
                    //Coord -= 8;
                    Coord -= 12;
                    break;
            }
        }
        public bool Check(int Coord)
        {
            //if (Coord % 7 == 0 || Coord % 7 == 6 || Coord <= 0 || Coord >= 69)
            if (Coord % 13 == 0 || Coord % 13 == 1 || Coord < 1 || Coord > 260)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}
post_arrow
441 0

Rubbellos

Punkte: 70


2 Lösungen
3 Kommentare

#2
24.04.2017 um 17:34 Uhr
Das liegt daran das mein Tunnel nur 5x10 Platten groß ist, hätte ich wohl dazuschreiben sollen.. Ups
Aber danke für den Hinweis :)
Ändern kann man die Lösung nicht mehr, oder? Sonst würde ich meinen Code so verändern das der Tunnel nach User Eingabe generiert wird.
Mfg Rubbellos
post_arrow
442 0

hollst

Punkte: 7130

360 Aufgaben
72 Lösungen
65 Kommentare

#3
24.04.2017 um 18:35 Uhr
Ändern an dem Eingereichten kannst Du nicht mehr, das bleibt stehen so bis in alle Ewigkeit,

aber Du kannst eine weitere Lösung einreichen, vielleicht mit einer kurzen Anmerkung als Text
vor dem Code.

Alles Gute!

post_arrow
443 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben