Wie generiere ich eine Zufallszahl in C ++?
Ich versuche ein Spiel mit würfeln, und ich brauche Zufallszahlen in es (zu simulieren, die Seiten des Würfels. Ich weiß, wie man es zwischen 1 und 6). Mit
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int main()
{
srand((unsigned)time(0));
int i;
i = (rand()%6)+1;
cout << i << "\n";
}
nicht sehr gut funktionieren, denn wenn ich das Programm ein paar mal, hier ist die Ausgabe die ich bekomme:
6
1
1
1
1
1
2
2
2
2
5
2
So, ich möchte einen Befehl, der erzeugt eine verschiedenen Zufallszahl jedes mal, nicht die gleiche, die 5 mal in Folge. Gibt es einen Befehl, der dies tun wird?
Kommentar zu dem Problem
Verteilung der Fragen abgesehen, im Hinterkopf behalten, dass mit Zufallszahlen kommt die Möglichkeit, immer das gleiche Ergebnis mehrmals in Folge. Wenn Sie waren garantiert nicht die gleiche Zahl zweimal in einer Zeile, die Ergebnisse würden nicht wirklich zufällig sein, würden Sie?
Was macht Sie denken, dass diese zahlen nicht zufällig? Werfen Sie einen Würfel für real, und Sie könnte sehr gut erhalten dieses Ergebnis. Wenn Sie waren garantiert anders zwischen jedem Wurf dann würde es nicht wirklich zufällig sein würde.
Lesen Sie auch eternallyconfuzzled.com/arts/jsw_art_rand.aspx, warum mit dem modulo-operator ist nicht oft eine gute Idee.
Sie sind Missverständnis viel mehr als eine passt in ein Kommentar oder sogar eine Antwort. Sie müssen lernen, selbstständig zu pseudo-Zufallszahlen-Generatoren, über die Samen, über die Bedeutung der Kommissionierung einen wirklich zufälligen seed, und über einheitliche Distributionen.
Wenn Sie Saatgut mit der Zeit. Dies bedeutet auch, dass wenn Sie führen Sie Ihr Programm mehr als einmal in der Sekunde Sie erhalten die gleiche Nummer.
InformationsquelleAutor der Frage Predictability | 2012-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das grundlegende problem der test-Anwendung ist, dass Sie rufen
srand
einmal und dann rufenrand
eine Zeit-und Ausfahrt.Den ganzen Punkt
srand
Funktion ist die Initialisierung der Sequenz von pseudo-Zufallszahlen mit random seed. Es bedeutet, dass, wenn Sie übergeben Sie den gleichen Wert zusrand
in zwei verschiedenen Anwendungen (mit der gleichensrand
/rand
Umsetzung) erhalten Sie genau die gleichenrand()
Werte Lesen, dass nach. Aber deine pseudo-random-Sequenz besteht aus einem element, das nur - Ihr output besteht aus den ersten Elementen der verschiedenen pseudo-random-Sequenzen ausgesät mit der Zeit von 1 Sekunde Genauigkeit. Also, was erwartest du? Wenn Sie geschehen, führen Sie die Anwendung auf der gleichen Sekunde Ihr Ergebnis ist das gleiche natürlich auch (wie Martin York bereits erwähnt, in einem Kommentar auf die Antwort).Eigentlich sollten Sie rufen
srand(seed)
einer Zeit, und dann rufen Sierand()
viele Male und zu analysieren, die Sequenz - so sollte es Aussehen zufällig.InformationsquelleAutor der Antwort Serge Dundich
Verwendung von modulo kann Voreingenommenheit in der die Zufallszahlen, abhängig von der Zufallszahl-generator. Sehen Sie, diese Frage für mehr info. Natürlich, es ist durchaus möglich, sich wiederholenden zahlen in einer zufälligen Reihenfolge.
Versuchen, einige C++11 features zur besseren Verteilung:
Sehen Sie, diese Frage/Antwort für weitere Informationen über die C++11-Zufallszahlen. Das obige ist nicht der einzige Weg, dies zu tun, aber ist eine Möglichkeit.
InformationsquelleAutor der Antwort Cornstalks
Wenn Sie steigern libs erhalten Sie einen Zufallsgenerator auf diese Weise:
Wo ist die Funktion
current_time_nanoseconds()
gibt die aktuelle Zeit in Nanosekunden, die verwendet wird, als ein Samen.Hier ist eine Allgemeine Klasse, um die zufällige Ganzzahlen und Daten in einer Reihe:
InformationsquelleAutor der Antwort madx
http://en.cppreference.com/w/cpp/numeric/random/rand
InformationsquelleAutor der Antwort arley
Hier ist eine Lösung. Erstellen Sie eine Funktion zurückgibt, die random-Nummer und legen Sie es
außerhalb der main-Funktion, um es global. Hoffe, das hilft
InformationsquelleAutor der Antwort HDSSNET
Use-case-Szenario
Ich verglich Vorhersehbarkeit problem, eine Tasche mit sechs bits von Papier, die jeweils mit einem Wert von 0 bis 5 geschrieben. Ein Stück Papier ist aus dem Beutel gezogen jedes mal ein neuer Wert erforderlich ist. Wenn die Tasche leer ist, dann werden die zahlen wieder in die Tasche.
...von daher, ich kann ein Algorithmus sortiert.
Algorithmus
Eine Tasche ist in der Regel eine
Collection
. Ich entschied mich für einebool[]
(andernfalls bekannt als ein boolean array, Ebene bit-oder bit-map) nehmen Sie die Rolle des bag.Der Grund, warum ich wählte einen
bool[]
ist, da der index jedes Elements ist bereits der Wert des einzelnen Stück Papier. Wenn die Unterlagen etwas anderes auf Sie geschrieben werden, dann würde ich einDictionary<string, bool>
an seinem Platz. Der Boolesche Wert wird verwendet, um zu verfolgen, ob die Zahl gezogen wurde, oder noch nicht.Einen Zähler genannt
RemainingNumberCount
wird initialisiert, um5
, die nach unten zählt als eine zufällige Nummer gewählt. Das spart uns davor, zu zählen, wie viele Stücke Papier sind Links jedes mal, wenn wir möchten, zeichnen Sie eine neue Nummer.Wählen Sie den nächsten Zufallswert ich bin mit einem
for..loop
zu Scannen durch die Tasche von Indizes und einen Zähler zum zählen aus, wenn einindex
istfalse
genanntNumberOfMoves
.NumberOfMoves
wird verwendet, um wählen Sie die nächste verfügbare Nummer.NumberOfMoves
ist der erste Satz, ein zufälliger Wert zwischen0
und5
, weil es sind 0..5 verfügbaren Schritte, die wir machen können, durch die Tasche. Für die nächste iterationNumberOfMoves
eingestellt ist, wird ein zufälliger Wert zwischen0
und4
, weil es nun 0..4 Schritte, die wir machen können, durch die Tasche. Als Nummern verwendet werden, die verfügbaren zahlen zu reduzieren, so dass wir stattdessen verwendenrand() % (RemainingNumberCount + 1)
zu berechnen, wird der nächste Wert fürNumberOfMoves
.Wenn die
NumberOfMoves
Zähler null erreicht, wird derfor..loop
sollte wie folgt:for..loop
's index.false
.for..loop
.Code
Den code für die obige Lösung ist wie folgt:
(setzen Sie die folgenden drei Blöcke in den main .cpp-Datei eins nach dem anderen)
Ein Console-Klasse
Erstelle ich diese Konsole Klasse, denn es erleichtert das umleiten der Ausgabe.
Unten im code...
...kann ersetzt werden durch...
...und dann diese
Console
Klasse kann gelöscht werden, wenn gewünscht.Main-Methode
Beispiel für die Verwendung wie folgt:
Beispiel für die Ausgabe
Wenn ich das Programm ausgeführt habe, bekam ich die folgende Ausgabe:
Schlußwort
Dieses Programm wurde geschrieben, mit Visual Studio 2017, und ich wählte, um es ein
Visual C++ Windows Console Application
Projekt mit.Net 4.6.1
.Ich mache nichts besonderes hier, also sollte der code funktionieren in früheren Versionen von Visual Studio zu.
InformationsquelleAutor der Antwort Knickerless-Noggins
für zufällige jedem AUSFÜHREN der Datei
InformationsquelleAutor der Antwort Nehigienix