C# :: Aufgabe #258

5 Lösungen Lösungen öffentlich

Stochastische Ermittlung der Eulerschen-Zahl

Anfänger - C# von hollst - 12.04.2019 um 09:37 Uhr
Wir betrachten folgendes Zufallsexperiment: Aus einer Menge reeller und gleichverteilter Zahlen {X} mit 0 <= x < 1.0
ziehen wir solange Zahlen x1, x2 ... xn bis deren Summe >= 1.0 ist. n ist dann das Ergebnis eines Zufallsexperimentes.
Wir müssen mindestens zweimal ziehen, den ein einzelnes Zufalls-x ist ja immer kleiner als 1.0.

Die Frage lautet: Wie groß ist n im Mittel?

Hinweis: Laut Theorie ist n = 2.718281828459045... (= e). Nun gut, grau ist alle Theorie, wir wollen sehen, ob der Computer
(in etwa) der gleichen Meinung ist.

Viel Spaß!

Lösungen:

vote_ok
von Z3RP (1020 Punkte) - 23.04.2019 um 13:48 Uhr
Quellcode ausblenden C#-Code
static void stochastischeErmittlung()
		{
			double bigSum = 0;
			int i = 1;
			while (true)
			{
				double sum = 0;
				int iterations = 0;
				Random rnd = new Random();
				while (sum < 1)
				{
					sum += rnd.NextDouble()* 0.9;
					iterations++;
				}
				bigSum += iterations;
				i++;

				Console.Clear();
				Console.WriteLine(i+": "+bigSum / i);
				Thread.Sleep(16);
			}
		}
vote_ok
von hollst (11120 Punkte) - 17.05.2019 um 12:43 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;

namespace aufgabe_258
{
    class Program
    {
        static void Main()
        {
            Random random = new Random();
            UInt32 nmax = (UInt32)1E+9;
            UInt32 glob_counter = 0;
            for (UInt32 n = 0; n < nmax; n++)
            {
                Double temp = 0.0;
                UInt32 counter = 0;
                while(temp < 1.0)
                {
                    temp += random.NextDouble();
                    counter++;
                };
                glob_counter += counter;
            }
            WriteLine($"exact:  {Math.E}");
            WriteLine($"approx: {1.0 * glob_counter / nmax}");
            ReadKey();
        }
    }
}
vote_ok
von t.wi (650 Punkte) - 12.06.2019 um 12:21 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace übung258
{
    class Program
    {
        static void Main(string[] args)
        {
            double countersum = 0;
            Random zufall = new Random();
            for(int c = 1; c <=1000;c++)
            {
                double xsum = 0;
                int counter = 0;
                while (xsum < 1)
                {
                    double x = zufall.Next(0, 10);
                    x = x / 10;
                    Console.WriteLine(x);
                    xsum = xsum + x;
                    counter++;
                }
                Console.WriteLine("Finale Summe: " + xsum);
                Console.WriteLine("Anzahl zahlen: " + counter+"\n");
                countersum = countersum + counter;
            }
            Console.WriteLine("Durschnitt der Benötigten zahlen: "+countersum / 1000);
            Console.ReadKey();
        }
    }
}
vote_ok
von suppengruen (190 Punkte) - 12.06.2019 um 16:16 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;

namespace EulerscheZahl
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> n = new List<int>();
            Random rand = new Random();
            int count = 0, mid = 0;
            double x = 0;
            float mitte = 0.0f, anzahl;
            Console.WriteLine("Gib an wie viele Schleifendurchläufe du machen willst...");
            anzahl = float.Parse(Console.ReadLine()); 
            for(int y = 0; y < anzahl; y++)
            {
                do
                {
                    x = x + rand.NextDouble();
                    count++;
                } while (x < 1.0);
                n.Add(count);
                count = 0;
                x = 0;
            }
            
            n.ForEach(delegate (int zahl)
            {
                mid = mid + zahl;
            });
            mitte = mid / anzahl;
            Console.WriteLine("Das Ergebnis ist: {0}",mitte);
            Console.ReadLine();
        }
    }
}
vote_ok
von Kotgreifer (660 Punkte) - 18.06.2019 um 10:41 Uhr
Quellcode ausblenden C#-Code
using System;
namespace Euler
{
    class Program
    {
        static void Main(string[] args)
        {
            int glb_counter = 0;
            Random rnd = new Random();
            for (int i = 0; i < 1000000; i++)
            {
                double tmp = 0.0;
                int counter = 0;
                while (tmp<1)
                {
                    tmp += rnd.NextDouble();
                    counter++;
                }
                glb_counter += counter;
            }
            double erg = (double)glb_counter / 1000000;
            Console.WriteLine(erg);
            Console.Read()
        }
    }
}