Nicht-Wiederholung random number generator
Ich würde gerne eine Zahl-generator, der wiederholt nicht die Nummer gegeben
schon (C++).
Alles was ich weiß ist:
int randomgenerator(){
int random;
srand(time(0));
random = rand()%11;
return(random);
} //Added this on edition
Diese Funktion gibt mir redundant zahlen.
Ich versuche, erstellen einen Fragebogen, Programm, das gibt 10 Fragen in zufälliger Reihenfolge, und ich möchte nicht, dass die Fragen zu erscheinen.
Kennt jemand die syntax?
Wenn Ihr random number generator nicht wiederholen kann, verliert es einen wichtigen Aspekt der Zufälligkeit. Wenn jemand weiß, dass die Zeit, deren Richtigkeit von Vermutungen erhöht, wie es erreicht gegen Ende der Periode, mit 100% iger Sicherheit auf die Letzte Annahme.
srand() ausgeführt werden soll EINMAL und nur einmal beim Programmstart.
Man könnte einfach speichern als int-den letzten Wert, und wenn der neue Wert ist gleich der letzten, fügen einem zufälligen Zahl zwischen 1 und der maximale Wert, den Sie möchten, minus die Zahl, die Sie bekam. Sie können dies tun, einfach mit E-Modul und es ist eine Art von random-y als einfach mit der Funktion " rand() 🙂
Gut, der pseudo-random-generator in C++ und C saugt.
Egal wie schlecht Sie denken, dass die RNG in "C und C++" ist, zu versuchen, Ihre eigenen zu machen ist garantiert, um zu saugen mehr. -gguuaarraanntteeeedd
srand() ausgeführt werden soll EINMAL und nur einmal beim Programmstart.
Man könnte einfach speichern als int-den letzten Wert, und wenn der neue Wert ist gleich der letzten, fügen einem zufälligen Zahl zwischen 1 und der maximale Wert, den Sie möchten, minus die Zahl, die Sie bekam. Sie können dies tun, einfach mit E-Modul und es ist eine Art von random-y als einfach mit der Funktion " rand() 🙂
Gut, der pseudo-random-generator in C++ und C saugt.
Egal wie schlecht Sie denken, dass die RNG in "C und C++" ist, zu versuchen, Ihre eigenen zu machen ist garantiert, um zu saugen mehr. -gguuaarraanntteeeedd
InformationsquelleAutor Jpeh Noynay | 2011-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ich tun würde:
EDIT: ich habe keine Ahnung, wie die Fragen sind gespeichert, also.. 🙂
Ich bin vorausgesetzt, die Fragen sind gespeichert in einem Vektor-oder somesuch mit random access. Jetzt habe ich generiert 10 Zufallszahlen, die sich nicht wiederholen: 7, 4, 12, 17, 1, 13, 9, 2, 3, 10.
Ich würde verwenden diese als Indizes für den Vektor der Fragen:
+1, Weil schneller als meine! 🙂
Das mag ich, aber ich habe noch keine Ahnung, wie es mir helfen wird pick-up Fragen.
aus deinem Beispiel sieht es aus wie Sie wollen, haben einen generator, gibt eine Zahl zurück, die Sie dann als ein index, um Ihre Liste von Fragen. Die Antwort, die hier vorgeschlagen ermöglicht es Ihnen, eine Liste von Fragen, randomize seine Ordnung, und dann einfach Durchlaufen.
oh cool, jetzt bekomme ich es.
InformationsquelleAutor The Communist Duck
Sie versuchen, das problem zu lösen "der falsche Weg".
Versuchen Sie dies statt (angenommen, Sie haben eine
vector<int>
mit Frage-ids, aber der gleichen Idee funktionieren wird, mit was auch immer Sie haben):Wie sind Ihre Fragen, die dann abgespeichert? Außerdem ist dieses Hausaufgaben?
Ich bin mit der Funktion, die ich schrieb in der Frage zu, wählen Sie eine zufällige Zahl zwischen 0-10 und ich geben den Wert zurück zu meinem main-Programm. Je nachdem, welcher Wert ist äquivalent zu einer bestimmten Frage (z.B. wenn random == 1, dann nenne ich die Funktion: "Frage 1". Nein, es ist nicht die Hausaufgaben. Ich bin nur ein Programmier-enthu hier. 😀
Max Lybbert Antwort hat einige Beispiel-code, den Sie verwenden können. Aber Sie müssen auch Lesen, einige buchen, die Sie führt zu den STL.
InformationsquelleAutor Jon
Klingt wie Sie im wesentlichen wollen shuffle ein deck von Karten (in diesem Fall die "Karten" - Fragen, in Frage stellen oder zahlen).
In C++, die ich tun würde:
Sie nicht zur hand haben, all die Fragen, mehr als du zu tun hast, eine ganze deck von Karten jedes mal, wenn Sie ein Spiel spielen. Sie können, natürlich, aber es gibt keine solche Forderung.
InformationsquelleAutor Max Lybbert
Erstellen Sie einen Vektor mit 10 Elementen (zahlen 1-10), dann mische es mit
std::random_shuffle
. Dann einfach Durchlaufen.Ja? So können Sie nur Durchlaufen wird, N Elemente.
das ist im Prinzip das gleiche, aber dieser Ansatz gibt Ihnen die O(N+M) Zeit, während Ihr gibt O(NM).
Offensichtlich. Was ich 'm versucht zu sagen ist, dass die Formulierung "erstellen Sie einen Vektor mit 10 Elementen (zahlen 1-10)" ist irreführend, wenn nicht fehlerhaft, da der Vektor sollte
0...M-1
. Ich 'd geben +1, denn dies ist algorithmisch überlegen, ob die Antwort wurde geschrieben, um die Adresse des OP' s Frage.Ich bin mir nicht sicher, ich verstehe dich @Jon, zumal Sie gab Die Kommunistische Ente +1 und er empfahl, die genau die gleiche Sache.
InformationsquelleAutor Benjamin Lindley
Sollte mehr wie folgt Aussehen: (Hinweis: keine lösen Sie Ihre ursprünglichen problem).
Einen besseren Weg zur Lösung des ursprünglichen Problems ist die pre-generieren Sie die zahlen, so dass Sie wissen, dass jede Zahl wird nur einmal angezeigt. Dann schieben Sie die Reihenfolge zufällig.
InformationsquelleAutor Martin York
InformationsquelleAutor Anthony
Warum nicht einige STL zur Durchführung der Prüfungen für Sie? Die Idee:
Erstellen Sie eine (zunächst leere) set von 10 ganzen zahlen, wird auf die Indizes der random-Fragen (Sie wird eindeutig als gesetzt verbietet doppelte Elemente). Halten Sie die Zufallszahlen in [0,
num_of_questions
-1] in es, bis es wächst zu einer Größe von 10 (Duplikate erhalten automatisch abgelehnt). Wenn Sie haben, setzen Sie sich bereit, Durchlaufen und die Ausgabe der Fragen auf die entsprechenden Indizes:Ich kann etwas fehlt, aber es scheint mir, die Antworten, verwenden Sie das mischen von entweder Fragen oder Indizes führen Sie weitere Berechnungen, oder verwenden Sie eine unnötige Speicher-overhead.
InformationsquelleAutor kyriakosSt