2017-03-14 2 views
1

Ich benutze srand() um einige Pseudozufälligkeiten in meinem c/C++ Programm zu haben.Wie Zufälligkeit ist bei der Initialisierung der c/C++ - Samen mit kleinen Werten und einer höheren?

Ich frage mich, ob ein Srand (1) und Srand (2) eine Zufälligkeit sehr ähnlich haben, sagen wir, Srand (21254) und Srand (9897455)?

Weil, ich lief mein Programm mit kleinen verschiedenen Zahlen für den Samen, und ich habe einen Eindruck, der anders ist!

Mit freundlichen Grüßen

+3

Schlagen Sie in '' sehen die neuen Funktionen untersuchen: http://en.cppreference.com/w/cpp/header/random besonders 'mt19937' Hinsichtlich' rand() ': _“ Es gibt keine Garantien hinsichtlich der Qualität der erzeugten Zufallssequenz. "_ Http://en.cppreference.com/w/cpp/numeric/random/rand –

+1

Sie sollten' srand' nicht mit einer konstanten Zahl verwenden. Ihr Programm wird bei jedem Start die gleiche Sequenz geben. – mch

+1

Nicht verwandt mit Ihrer Frage (na ja, zu Ihrem möglichen Problem sowieso), aber ich schlage vor, dass Sie beginnen, die neuen [Pseudo-Zufallszahlengenerierungsklassen] (http://en.cppreference.com/w/cpp/numeric/random) in zu verwenden C++. –

Antwort

1

Da die Kommentare sagen, sollten Sie eine echte Zufallszahl-Bibliothek verwenden, wenn Sie besorgt über die Qualität von Zufallszahlen sind.

srand() und rand() sind in der Regel ein periodischen Grund Pseudo-Zufallszahlengenerator. Es wird eine feste Folge von Werten geben, die alle nacheinander durchlaufen werden. Wenn Sie 12 als Ihre letzte Nummer erhalten haben und 600 als Ihre nächste Nummer erhalten haben, erhalten Sie beim nächsten Mal, wenn der Zyklus wieder auf 12 zurückgeht, 600 als Ihre nächste Nummer.

Daher beeinflusst der Seed nicht die "Zufälligkeit" oder Qualität der Pseudozufallszahlen. Der Aufruf von srand(21254) oder srand(9897455) beginnt einfach an verschiedenen Punkten in der gleichen Reihenfolge.

Hinweis: Es ist möglich, dass eine bestimmte Implementierung von rand() wird nicht Verwendung dieser Methode: Es ist jedoch unwahrscheinlich, und in Abwesenheit jeglicher Garantien sind Sie besser dran mit dem <random> library die tut haben Garantien für die Methoden zum Generieren von Zufallszahlen. Die Klassen in dieser Bibliothek erzeugen Sequenzen von Zufallszahlen mit besserer Qualität.

+0

Ich benutze eine Bibliothek/Löser, die srand48() aufruft, ich werde prüfen, ob es die gleiche Implementierung hat. Auf der anderen Seite ist der Punkt meiner Frage, dass, wenn wir srand (1) verwenden und wir annehmen, dass es 12 als Startpunkt und 600 als nächsten Wert erzeugen wird, srand mit nahem Wert des Samens (2,3,4 , ..) wird zu einem engen Verhalten führen, wie 14 als erster Punkt und 650 als nächster Punkt! Es ist anders, aber sie teilen ein gemeinsames Muster! – Kadiro

0

Sie sagen in den Kommentaren, dass Sie nicht die Möglichkeit haben, einen besseren Zufallszahlengenerator zu wählen. Das ist eine Schande, denn C++ hat the random header seit C++ 11, und es ist gegenüber dem alten rand/srand erheblich verbessert.

Es gibt definitiv eine Korrelation zwischen dem Samen, den Sie in srand verwenden, und den daraus resultierenden Zahlen, die Sie aus rand ziehen, das ist der Sinn des Seeding. Einige C++ - Implementierungen machen dies offensichtlicher als andere, da die Implementierung von rand nicht genau spezifiziert ist und jeder Bibliothek überlassen wird.

Die einfachste Möglichkeit, diese Korrelation zu verbergen, besteht darin, nach dem Seeding ein paar Zufallszahlen zu nehmen und sie einfach wegzuwerfen, da die Korrelation mit jeder generierten Zahl weniger offensichtlich wird. Wenn nicht, wäre es kein akzeptabler Zufallszahlengenerator.

srand(1); 
cout << "throwing away " << rand() << endl; 
cout << "throwing away " << rand() << endl; 
cout << "using " << rand() << endl; 

srand(2); 
cout << "throwing away " << rand() << endl; 
cout << "throwing away " << rand() << endl; 
cout << "using " << rand() << endl; 
Verwandte Themen