C++ Zufallsgenerator ohne Wiederholung zahlen
Ich habe gesucht hoch und niedrig für ein Typ der Funktion, wird dieser code
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void ran(int array[], int max);
int main() {
printf("Today's lottery numbers are:\n");
for (int i = 0; i < 6; i++)
srand((unsigned)(NULL));
}
in einem random number generator, die sicherstellt, dass keine Wiederholung zahlen, kann jemand mir helfen mit ihm? nach der Prüfung Plane ich, um es zu drucken mit printf("%d\n", rand()%50);
Brauche ich nur eine routine, die macht das sicher seine nicht zu wiederholen. Bitte, Wenn Sie können, geben Sie mir eine routine ich wäre sehr erleichtert und sicher sein, zu pay it forward.
Dank. Die Bibliotheken scheinen nicht zu sein, Lesen Sie rechts auf dieser scren, aber Sie sind stdio, stdlib, die Zeit und im mit namespace.
- Bearbeiten Sie Ihre Frage: aktivieren Sie Ihren code ein, und drücken Sie dann die "101 010" - Taste.
- Seite merken - Warum
(unsigned)(NULL)
??? Nicht 0, nicht für Sie arbeiten? - Sie können immer speichern Sie Ihre zufällig generierten zahlen in einem stack. Dann überprüfen Sie, um zu sehen, wenn ein neuer rand ist bereits in den Stapel. Wenn dem so ist, erzeugen Sie eine neue Nummer ein und prüfen Sie erneut.
- Was genau meinst du mit "nicht wiederholen"? Nur mit endlicher Genauigkeit, es gibt nur eine endliche Anzahl von möglichen zahlen dargestellt werden kann. Meinst du eine einzige zufällige permutation von N zahlen (Integer)?
- Ein set würde wahrscheinlich tun Sie es, schön, nicht wahr?
- ES IST NUR EIN ZUFALL, meine Güte. Was du suchst ist ein "SHUFFLE". Guter Kummer!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht einfach das nutzen, was bereits in der STL? Suchen Sie in Ihren Beispiel-code, und vorausgesetzt, es ist einigermaßen repräsentativ für das, was Sie tun möchten, sollte alles drin sein. (Ich nehme an, Sie brauchen eine relativ kleine Auswahl von zahlen, also Speicher würde nicht eine Einschränkung)
Mit
std::random_shuffle
, und einstd::vector
mit den ganzen zahlen in den Bereich, den Sie möchten, dass Ihre zahlen zu sein, sollten Sie eine Sequenz eindeutiger Zufallszahlen, die Sie brauchen, in deinem Beispiel-code.Werden Sie immer noch, call srand einmal, und nur einmal, vor der Verwendung
std::random_shuffle
. Nicht mehrere Male wie du tust in deinem aktuellen code-Beispiel.Wenn Ihr Bereich der Zufallszahlen ist endlich und klein, sagen, Sie haben
X
verschiedene zahlen.I
zwischen 0 undX
, und erhalten seinen WertX
Wert inI
positionSollten Sie nur nennen
srand
einmal in Ihrem code und sollten Sie rufen es mit einem "zufälligen" seed wietime(NULL)
.Durch den Aufruf
srand
innerhalb der Schleife, und nannte es mit einem 0 Samen jedes mal, erhalten Sie sechs zahlen genau das gleiche.Aber auch mit diesen Korrekturen,
rand()%50
können geben Sie die gleiche Nummer zweimal. Was Sie sollte verwenden, ist eine shuffle-Algorithmus wie diese eine da es funktioniert genau das gleiche wie die Lotterie-Maschinen.Hier ist ein komplettes Programm, die zeigen, dass in Aktion:
Beispiel ausgeführt wird:
Ich würde empfehlen, mit einem besseren random number generation Algorithmus, der bieten kann, die intern statt mit rand.
Das problem mit
rand()
und versuchen zu verhindern, dass wiederholt wird, dass die Suche nach einer unbenutzten Nummer langsamer wird mit jeder Zahl Hinzugefügt, um die Liste, schließlich wurde ein sehr langer Prozess der Suche nach und der Verschrottung zahlen.Wenn man sich ein komplexer pseudo-random number generator (und es gibt viele, viele zur Verfügung, check-Boost für ein paar), müssen Sie eine einfachere Zeit und können vielleicht vermeiden, dass die Wiederholungen insgesamt. Es kommt auf den Algorithmus, so dass Sie brauchen werden, um die Dokumentation zu kontrollieren.
Dies zu tun, ohne Verwendung von zusätzlichen Bibliotheken, Sie könnte vorfüll ein Vektor oder eine Liste mit einer sequentiellen (oder auch zufällige) zahlen, machen Sie sicher, dass jede Zahl einmal in der Liste. Dann, zu erzeugen, eine Zahl, eine Zufallszahl erzeugen und auswählen (und entfernen) das Element aus der Liste. Durch entfernen jedes Element, wie es verwendet wird, so lange wie jeder Artikel war dieses mal, um zu beginnen mit, werden Sie nie in ein Duplikat.
Und wenn Sie haben Zugriff auf C++0x, können Sie mit der neuen random-generator Einrichtungen, wickeln Sie alle diese junk-E-für Sie!
http://www2.research.att.com/~bs/C++0xFAQ.html#std-random