Random Zahlen sollen nicht doppelt sein!

Neue Frage »

Auf diesen Beitrag antworten »
RavenPixel Random Zahlen sollen nicht doppelt sein!

Hallo,

ich habe nun gestartet ein Spiel zu programmieren (Mastermind, wenn das noch jemand kennt).
Doch gleich zu Anfang kommt ein Problem, dass die Zahlen, die unten als Zahlencode (später sollen es Farben werden) über ein array mit Zufallszahlen gefüllt werden, oftmals eine doppelte Zahl enthalten.

Dies soll verhindert werden, sodass in den 6 Plätzen eindeutige und einmalige Zahlen von 0-9 stehen.

Wie bekomme ich das hin? Hab schon einiges versucht, aber bin auf keinen Nenner gekommen.

Danke schon im Vorraus.
 
Auf diesen Beitrag antworten »
eulerscheZahl

Natürlich kenne ich Mastermind.

2 Möglichkeiten:
die intuitive: speichere in einem bool Array, was schon drankam. Nimm die neue Zahl nur, wenn sie noch nicht verwendet wurde

die effizientere:
Schreibe die Zahlen von 0-9 in ein Array:
code:
1:
0123456789

Würfle eine Zahl von 0-9, das ist der Arrayindex. Tausche die Zahl mit der an Stelle 9:
Beispiel 3:
code:
1:
0129456783

Die 3 ist jetzt fest. Würfle jetzt von 0-8 und tausche mit der Zahl an Stelle 8 (Beispiel: 5)
code:
1:
0129486753

Auf die Weise kriegst du am Ende des Arrays Zufallszahlen, die sich nicht wiederholen.
Auf diesen Beitrag antworten »
RavenPixel

Ich habe bereits ein array eingebaut, dabei ist das problem dann, dass ich diesen halt

Random r = new Random();

zugewiesen habe und diese in einer for-Schleife besetzt habe...

for (int i = 0; i < zahl.Length; i++)
{
zahl[i] = r.Next(Min, Max);
}

Deshalb dachte ich, dass ich diese damit direkt sortieren kann...
Auf diesen Beitrag antworten »
eulerscheZahl

Jetzt willst du die Zufallszahlen auch noch sortiert haben?
Der Codeausschnitt ist C#, oder?
 
Auf diesen Beitrag antworten »
RavenPixel

So hatte ich es zumindest vor, jedes spiel sollte ja einen neuen zahlencode bekommen..

ja es ist c#, hatte ich wohl vergessen zu sagen
Auf diesen Beitrag antworten »
eulerscheZahl

Sowas?
code:
1:
2:
3:
4:
5:
6:
HashSet<int> numbers = new HashSet<int> ();
Random r = new Random ();
while (numbers.Count < 6) {
	numbers.Add (r.Next (10));
}
Console.WriteLine (string.Join (", ", numbers.OrderBy (x => x)));
Auf diesen Beitrag antworten »
RavenPixel

Ist es in diesem Fall normal, dass die Zahlen immer aufsteigend sind?
Also die kleinste Zahl am Anfang und die Größte am Ende?
Auf diesen Beitrag antworten »
eulerscheZahl

Du hast etwas von Sortieren geschrieben.
Wenn du die Reihenfolge zufällig haben willst, lösche das OrderBy wieder raus.
Auf diesen Beitrag antworten »
RavenPixel

ach entschuldige... hab nicht richtig nachgedacht und falsch formuliert....

wollte wissen wie ich es innerhalb oder außerhalb der schleife direkt verhindern kann, dass eine zahl doppelt vorkommt.

das war gemeint, nicht sortieren, sry
Auf diesen Beitrag antworten »
eulerscheZahl

Ich habe ein HashSet verwendet. Das stellt sicher, dass jede Zahl nur einmal vorkommt.

Wenn du mit der Minimalzahl von Random.Next() auskommen willst, nimm das:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
int n = 10; int k = 6;
int[] numbers = Enumerable.Range (0, n).ToArray ();
Random r = new Random ();
for (int i = 0; i < k; i++) {
	int index = r.Next (i, n);
	int tmp = numbers [index];
	numbers [index] = numbers [i];
	numbers [i] = tmp;
}
Console.WriteLine (string.Join(", ", numbers.Take(k)));
Auf diesen Beitrag antworten »
RavenPixel

Vielen Dank, jetzt hat es funktioniert smile
Auf diesen Beitrag antworten »
progger

Das leute schon spiele programmieren . Geil großes Grinsen

Ich bin schon mit den Grundlagen überlastet
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »