rand() und srand() in C++
Was ist die Grundlage der Generierung von Zufallszahlen in C++?
Gibt es da eine Logik oder ein Prinzip dahinter?
Sind die zahlen, die völlig zufällig?
Angenommen, ich bin mit diesem Programm:
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int main()
{
/*
Declare variable to hold seconds on clock.
*/
time_t seconds;
/*
Get value from system clock and
place in seconds variable.
*/
time(&seconds);
/*
Convert seconds to a unsigned
integer.
*/
srand((unsigned int) seconds);
/*
Output random values.
*/
cout<< rand() << endl;
cout<< rand() << endl;
cout<< rand() << endl;
return 0;
}
Was es zeigt:
http://img14.imageshack.us/img14/1538/98271820.png
Zeigte 205 zweimal.
- Wo haben Sie gefunden Funktionen
random
undrandomize
? - Sie können so etwas wie /dev/random mit der
<random>
header. - in der Elften Klasse lehrbuch in einem Kapitel mit dem Titel "Standard-Library-Funktionen"
- Lassen Sie Ihre post-Titel, in Google. Dann nehmen Sie "in C++" und Suche nach diesem. Wenn die Ergebnisse der Suche werden diese Sie lassen Sie mit Fragen, kommen zurück und Fragen sich, diese Fragen.
- Die sind nicht zufällig. Das sind pseudo-zufällig .
- wie pseudo-random @Geschichtenerzähler
- Das heißt, Sie erzeugen eine Sequenz, passieren die meisten tests für die "Zufälligkeit", sondern es erzeugt in einer deterministischen Weise, und können repliziert werden, mit der richtigen Samen.
- Ich fixierte Ihre Titel konsequent zu sein mit dem code, den du fragst nach.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beginnend mit der zweiten Frage:
Nein, das ist sehr unwahrscheinlich, dass das jemals passieren in einem computer. Sie sind "pseudo-zufällige" zahlen, die eine Sequenz von zahlen, die variieren in der Reihe im Laufe der Zeit in einem random-Mode. Aber wenn Sie beginnen mit der gleichen "seed", Sie erhalten die gleiche Reihenfolge jedes mal. Diese Vorhersehbarkeit ist manchmal sehr nützlich, da es ermöglicht, wiederholen das gleiche experiment mehrmals mit dem gleichen Ergebnis - änderung der Samen, wird es ähnlich laufen, um ein anderes Resultat haben.
Die Funktion
srand
legt die Samen. Einige Systeme haben eine Funktion namensrandomize
, aber es ist nicht Teil des standard. Wenn es vorhanden ist, legt die Samen auf etwas unbekanntes, um den code - wie die aktuelle Uhrzeit in Millisekunden.Ja. Es gibt mehrere Methoden für die Erzeugung von pseudo-randum zahlen. Einfacher geschrieben werden können, in einer oder zwei Zeilen von C-code mit regulären
int
oderlong
Arten, und nur besteht aus der Einnahme der "aktuelle Wert" + einige Konstante, multipliziert mit einigen großen Zahl und modulo einige andere große Nummer.Komplexere Befehle beinhalten Dutzende von Zeilen mehr Recht komplizierte Mathematik mit großen zahlen - z.B. Mersenne Twister ist eine aktuelle Arbeit, steht als Quellcode zur Verfügung, wenn Sie suchen, ein wenig.
randomize
. Die ursprüngliche Frage Titel genanntenrandom
undrandomize
, aber ich habe es behoben zu findenrand
und srand` zu werden, im Einklang mit dem code. Ich weiß nicht, wasrandomize
ist (man randomize
kommt leer auf meinem system), abersrand()
erfordert eine explizite seed-argument.War die Frage im Grunde beantwortet Sie in den Kommentaren und eine andere Antwort, aber ich werde es sammeln sich in einem Ort.
C++
rand()
Funktion liefert nicht wirklich zufällige Reihenfolge von zahlen, sondern ein pseudo-random ein. Dies bedeutet, dass es ist im Grunde eine vordefinierte Sequenz von zahlen, die "random", aber irgendwo fest (eigentlich ist es komplizierter als das, aber dies ist eine Vereinfachung zum besseren Verständnis). Betrachten Sie es als eine lange Liste von ganzen zahlen.Jedem Aufruf
rand()
Funktion zieht die aktuelle Anzahl und bewegt den Zeiger auf die "aktuellen "zufällige" Zahl" auf die nächste.Was
srand()
Funktion tut, ist im Grunde die Einstellung der Zeiger zu einer Stelle in der Liste. Wenn Sie nicht rufen Sie diesrand()
Funktion bei jedem Start, oder rufen Sie es mit fester parameter (seed), haben Sie die gleiche Sequenz von zahlen auf jedes Programm starten.Wenn Sie die Einstellung Ihrer Saat, aus der Sekunden, wenn Sie starten Sie Ihr Programm zweimal innerhalb dieser Sekunde, Ihre Nachkommen werden das gleiche - daher produzieren das gleiche Ergebnis.
Versuchen Sie den folgenden code:
Werden Sie feststellen, dass jede "Sekunde" - Wert entsprechen, um einen festen "ersten" Wert für die
rand()
Funktion.