Ich habe einige Empfehlungen gesehen, Pseudozufallszahlengeneratoren nicht mehr als einmal pro Ausführung zu setzen, aber niemals mit einer gründlichen Erklärung. Natürlich ist es leicht, das folgende (C/C++), um zu sehen, warum Beispiel keine gute Idee ist:Probleme beim mehrfachen Ausseuchen eines Pseudozufallszahlengenerators?
int get_rand() {
srand(time(NULL));
return rand();
}
seit get_rand
mehrmals pro Sekunde Aufruf führt zu Ergebnissen wiederholt.
Aber wäre das folgende Beispiel nicht immer noch eine akzeptable Lösung?
MyRand.h
#ifndef MY_RAND_H
#define MY_RAND_H
class MyRand
{
public:
MyRand();
int get_rand() const;
private:
static unsigned int seed_base;
};
#endif
MyRand.cpp
#include <ctime>
#include <cstdlib>
#include "MyRand.h"
unsigned int MyRand::seed_base = static_cast<unsigned int>(time(NULL));
MyRand::MyRand()
{
srand(seed_base++);
}
int MyRand::get_rand() const
{
return rand();
}
main.cpp
#include <iostream>
#include "MyRand.h"
int main(int argc, char *argv[])
{
for (int i = 0; i < 100; i++)
{
MyRand r;
std::cout << r.get_rand() << " ";
}
}
, d.h. obwohl der Konstruktor MyRand
mehrere Male in schneller Folge aufgerufen wird, hat jeder Aufruf von srand
einen anderen Parameter. Offensichtlich ist dies nicht Thread-sicher, aber auch nicht rand
.
Ich könnte hinzufügen, dass der ganze Zweck dieser Übung ist, die "Last" von srand vom Client von 'MyRand' zu befreien, wo' MyRand' einen Würfel modellieren könnte. Auf der anderen Seite, wenn wir auch Glücksräder, Münzwürfe usw. auf die gleiche Weise bauen, werden wir eine Menge Samen bekommen. – a038c56f