Zufallszahlen Array in C#?
Hallo liebe Wissende,
ich stehe vor einem Problem in C# wo ich die Zahlen 1 bis 20 zufällig verteilt also unique in ein Array speichern soll. Mein Code enthielt mehrfach die Zahl 0 obwohl ich als Minimum 1 gesetzt und sie jetzt ausgeschlossen hatte. Die IndexOf Funktion scheint Probleme zu bereiten da sich nun Zahlen in arrayneu[] doppeln. Weiß jemand Rat und kann mir als Anfängerin in C# bitte helfen?
using System;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
int min = 1;
int max = 21;
int zahl; // speichere Zufallszahl
int[] arrayneu = new int[20]; Random randNum = new Random();
for (int i = 0; i < arrayneu.Length; i++)
{
zahl = randNum.Next(min, max);
if ((Array.IndexOf(arrayneu, zahl) < 0) || (zahl != 0))
{
arrayneu[i] = zahl;
}
}
foreach (int val in arrayneu)
{
Console.WriteLine(val);
}
}
}
}
Ausgabe z.B.
10
6
8
5
8
8
4
4
7
9
vielen lieben Dank schon Mal
Janine
4 Antworten
Wenn die Bedinung Deines "if"s innerhalb der for-Schleife nicht erfüllt wird, wird der entsprechende Platz im Array nicht gefüllt. Der Platz bleibt also auf dem ursprünglichen Wert, und das könnte dann die "0" sein.
Kommt jetzt ein bisschen drauf an, wie Du rausfinden willst, ob das Array voll ist, aber prinzipiell bist Du auf dem richtigen Weg ;)
Mein Code enthielt mehrfach die Zahl 0 (...)
Mit 0 werden die Array-Elemente initialisiert, so lange sie unbesetzt sind.
(...) wo ich die Zahlen 1 bis 20 zufällig verteilt (...) in ein Array speichern soll.
Ist es unbedingt notwendig, die Zahlen via Random zu ermitteln? Du musst doch jedesmal eine neue Zahl generieren lassen, wenn diese schon im Array existiert. Mit Abnahme der möglichen Zahlen, die noch gesetzt werden können, steigert sich der Aufwand.
Ein viel einfacherer Ansatz wäre es doch, erst die Zahlen in das Array zu legen und dieses dann zu mischen. Ein ziemlich einfacher Ansatz mit Linq:
OrderBy(_ => Guid.NewGuid())
das ist natürlich ein viel besserer & performanter Ansatz, vielen lieben Dank :-) ich muss mal prüfen ob Linq genutzt werden kann, als Einsteiger habe ich mich bislang an den Basis Funktionen versucht, ich schau mal
Auch ohne Linq kannst du mit einer Schleife und einem Zufallswert die Liste zufällig sortieren. Du gehst einfach durch das schon gefüllte Array, und lässt dir bei jedem Schritt einen Zufallsindex generieren. Das aktuelle Element vertauscht du dann mit dem Element am Zufallsindex.
das new Random() habe ich extra vor der for Schleife angegeben wie ich hier im Portal recherchiert hatte - entschuldigung der Code wurde wurde anscheint etwas zerpflückt, bearbeiten kann ich ihn leider nicht mehr
Du überschreibst die Zahlen in deinem Array ja sowieso, also ist egal, was da vorher drinnen stand. Wenn diese Bedingung für das IF-Statement einmal nicht erfüllt ist, dann wird der defaut-Wert von int, nämlich 0, so stehen gelassen. Das ist genau dann der Fall, wenn bereits eine Zahl, die zufällig ermittelt wurde, in dem Array steht und du nun nicht die gleiche Zahl noch einmal eintragen möchtest.
Aus dem IF-Statement schließe ich, dass du einen Array mit Zufallszahlen genau von 1 bis 20 haben möchtest. Es bietet sich da an, diese Zahlen nicht zufällig zu ermitteln, sondern bei der Deklaration direkt in den Array zu schreiben:
int[] zufallszahlen = new int[]{1, 2, 3, /* ... */, 20}
und dann lediglich die Elemente in dem Array durcheinander zu sortieren.
Es bietet sich daher dann an dieser Stelle eine List<int> statt einem int[] an, weil dort die Elemente nicht so "fest verschweißt" sind wie bei einem Array. Dadurch kann man auch ganz leicht die zufälligen Zahlen durcheinander sortieren, siehe auch den Beitrag hier: Randomize a List<T>.
sehr interessant diese Vorgehensweise, mit List<int> habe ich mich noch nicht beschäftigt gehabt, vielen Dank für den Input :-)
hmm das könnte sein, also muss man eher eine Endlosschleife mit Abbruchbedingung definieren bis das arrayneu[] voll ist?