Ho visto un bel paio di raccomandazioni per non semina numeri pseudo-casuali generatori più di una volta per l'esecuzione, ma mai accompagnato da una spiegazione approfondita. Naturalmente, è facile capire perché il seguente (C/C++) esempio non è una buona idea:Problemi con il seeding di un generatore di numeri pseudo-casuali più di una volta?
int get_rand() {
srand(time(NULL));
return rand();
}
dal chiamando get_rand
più volte al secondo produce ripetuti risultati.
Ma non sarebbe il seguente esempio ancora essere una soluzione accettabile?
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() << " ";
}
}
, anche se il costruttore MyRand
: s viene chiamato più volte in rapida successione, ogni chiamata a srand
ha un parametro diverso. Ovviamente, questo non è thread-safe, ma poi ancora nessuno dei due è rand
.
Potrei aggiungere che l'intero scopo di questo esercizio è di alleviare il "peso" di chiamare srand dal client di 'MyRand', dove' MyRand' potrebbe modellare un dado. Ma d'altra parte, se costruiamo anche le ruote della fortuna, i lanci di monete ecc. Allo stesso modo, otterremo molti semi. – a038c56f