C# random array?
Ich habe hier in dem Code ein Random-Array erstellt. Wenn ich es starte, bekomme ich immer ein Array mit gleichen Zahlen. Wenn ich einen Breakpoint reinmache und es durchlaufen lasse, liefert es mir ein Array mit unterschiedlichen Zahlen. Ich weiß nicht mehr weiter! Kann mir bitte wer helfen? Danke.
Hier der Code:
static void Main(string[] args)
{
int[] arr = new int[6];
RandomArray(arr);
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
Console.ReadKey();
}
static int[] RandomArray(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
Random zufallszahlen = new Random();
int zahl = zufallszahlen.Next(1, 45);
arr[i] = zahl;
}
return arr;
}
3 Antworten
Die Lösung wurde dir schon genannt, hier nur nochmals eine Erklärung zu dem vorliegenden Verhalten:
Die Generation von Zufallszahlen (bzw. dessen Startwert) erfolgt bei dieser Klasse anhand der Zeit. Du erstellst pro Iteration ein neues Random-Objekt und dieses berechnet aufgrund des geringen zeitlichen Abstands zwischen den einzelnen Iterationen stets eine gleiche Zufallszahl.
Wenn du die Initialisierung des Objekts vor die Schleife schiebst, wird es nur einmal generiert und berechnet auch nur basierend auf einem Startwert immer neue Zahlen.
Bin mir nicht ganz sicher, aber könnte es sein das dein Array immer nur 0en hat?
Versuch mal das Array nach dem Methoden-Aufruf wieder in das Array zu speichern, also so:
static void Main(string[] args)
{
int[] arr = new int[6];
arr = RandomArray(arr);
....
}
Das müsste glaube ich die Lösung für dein Problem sein :)
Aus offiziellen Informationen hier: https://docs.microsoft.com/en-us/dotnet/api/system.random#avoiding-multiple-instantiations
Initializing two random number generators in a tight loop or in rapid succession creates two random number generators that can produce identical sequences of random numbers. (...)
Damit das nicht passiert, musst du die Erstellung von zufallszahlen aus der Schleife rausziehen:
//...
Random zufallszahlen = new Random();
for (int i = 0; i < arr.Length; i++)
{
int zahl = zufallszahlen.Next(1, 45);
arr[i] = zahl;
}
//...