Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Sonstige Fragen (http://www.informatikerboard.de/board/board.php?boardid=25)
--- Random Zahlen sollen nicht doppelt sein! (http://www.informatikerboard.de/board/thread.php?threadid=2887)


Geschrieben von RavenPixel am 26.02.2016 um 11:29:

  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.



Geschrieben von eulerscheZahl am 26.02.2016 um 11:36:

 

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.



Geschrieben von RavenPixel am 26.02.2016 um 11:44:

 

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...



Geschrieben von eulerscheZahl am 26.02.2016 um 11:47:

 

Jetzt willst du die Zufallszahlen auch noch sortiert haben?
Der Codeausschnitt ist C#, oder?



Geschrieben von RavenPixel am 26.02.2016 um 11:48:

 

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

ja es ist c#, hatte ich wohl vergessen zu sagen



Geschrieben von eulerscheZahl am 26.02.2016 um 11:52:

 

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)));



Geschrieben von RavenPixel am 26.02.2016 um 11:57:

 

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



Geschrieben von eulerscheZahl am 26.02.2016 um 11:59:

 

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



Geschrieben von RavenPixel am 26.02.2016 um 12:03:

 

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



Geschrieben von eulerscheZahl am 26.02.2016 um 12:11:

 

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)));



Geschrieben von RavenPixel am 26.02.2016 um 13:04:

 

Vielen Dank, jetzt hat es funktioniert smile



Geschrieben von progger am 09.03.2016 um 17:04:

 

Das leute schon spiele programmieren . Geil großes Grinsen

Ich bin schon mit den Grundlagen überlastet


Forensoftware: Burning Board, entwickelt von WoltLab GmbH