J'ai vu quelques recommandations pour ne pas ensemencer des générateurs de nombres pseudo-aléatoires plus d'une fois par exécution, mais jamais accompagné d'une explication complète. Bien sûr, il est facile de voir pourquoi l'exemple suivant (C/C++) n'est pas une bonne idée:Problèmes avec l'ensemencement d'un générateur de nombres pseudo-aléatoires plus d'une fois?
int get_rand() {
srand(time(NULL));
return rand();
}
depuis l'appel get_rand
plusieurs fois par seconde produit des résultats répétés.
Mais ne l'exemple suivant encore une solution acceptable?
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() << " ";
}
}
, c'est-à-dire même si le constructeur MyRand
: s est appelé plusieurs fois en succession rapide, chaque appel à srand
a un paramètre différent. Évidemment, ce n'est pas sûr pour les threads, mais là non plus, ce n'est pas rand
.
Je pourrais ajouter que le but de cet exercice est de soulager le «fardeau» d'appeler srand du client de 'MyRand', où' MyRand' pourrait être en train de modéliser un dé. Mais d'un autre côté, si nous construisons aussi des roues de fortune, des lancers de pièces etc. de la même manière, nous aurons beaucoup de graines. – a038c56f