visual studio fehler


#1
hallo,
ich habe zwei klassen, eine in der das form liegt und einer in der ich eine funktion habe die mir 3 zufallszahlen generiert. wenn der der klasse im der funktion nen breakpoint bei besagter funktion gesetzt habe kriege ich 3 unterschiedliche zahlen wenn das ganze debugge, wenn ich den breakpoint weglasse bekomme ich 3 mal die gleiche was ja ansich nicht sein kann.
meine frage ist nun woran das liegen kann oder viel besser wichtiger wie ich das behebe.
 
#3
code von der zufallszahlen funktion
Code:
public static int roll(int d)
        {
            Random rnd = new Random();
            return rnd.Next(1, d + 1);
        }
code über die ich diese funktion aufrufe:
Code:
public static object probe(int n)
        {
            int e = 0;
            int p = 0;
            string append = "";
            List<int> dice = new List<int>();


            for (int i = 0; i < n; i++)
            {
                dice.Add(roll(20));
            } // hier ist der breakpoint

            List<dynamic> output = new List<dynamic>();

            for (int i = 0; i < dice.Count(); i++)
            {
                output.Add(dice[i]);
                if (dice[i] == 1)
                {
                    e++;
                }
                else if (dice[i] == 20)
                {
                    p++;
                }
            }
            if (e > 1)
            {
                append = "Spezielle Erfahrung";
            }
            else if (dice.Count() > 1 && p > 1 || dice.Count == 1 && p == 1)
            {
                append = "Patzer!";
            }
            output.Add(append);
            return output.ToArray();
        }
 

cwriter

Erfahrenes Mitglied
#4
code von der zufallszahlen funktion
Aus der MSDN: https://msdn.microsoft.com/de-de/library/system.random(v=vs.110).aspx
To produce different sequences of random numbers, you can make the seed value time-dependent, thereby producing a different series with each new instance of Random. The parameterized Random(Int32) constructor can take an Int32 value based on the number of ticks in the current time, whereas the parameterless Random() constructor uses the system clock to generate its seed value. However, because the clock has finite resolution, using the parameterless constructor to create different Random objects in close succession creates random number generators that produce identical sequences of random numbers.
Im Prinzip hat sheels Glaskugel mal wieder hervorragend funktioniert ;)

Vielleicht noch zur Erläuterung: Wenn du Breakpoints setzt, wird das Programm angehalten, die System Clock, die per Default seedet, läuft aber weiter. Daher hast du mit Breakpoints unterschiedliche Resultate.
Wenn du aber keine Breakpoints setzt, dann ist dein Computer so schnell, dass er mehrmals pro Zeiteinheit ein Random()-Objekt initialisieren kann. Und damit ist der Seed immer gleich und die Resultate auch.

Du hast also mehrere Möglichkeiten:
1) Benutze eine statische Member des Typs Random, die nur einmal initialisiert wird. Dann musst du in roll() nur noch rnd.next() ausführen, und die Zahlen sind "zufällig".
2) Benutze den alternativen Konstruktor Random(int32), und übergib einen eigenen Seed, z.B. der Iteratorwert plus die aktuelle Zeit.
3) Benutze einen Kryptographischen RNG, z.B. mit RDRAND-Unterstützung. Das ist aber sehr viel langsamer und nicht rekonstruierbar.

Gruss
cwriter