Я видел довольно много рекомендаций, чтобы не загружать генераторы псевдослучайных чисел более одного раза за выполнение, но они никогда не сопровождались подробным объяснением. Конечно, легко понять, почему следующий пример (C / C ++) не является хорошей идеей:
int get_rand() {
srand(time(NULL));
return rand();
}
поскольку вызов get_rand
несколько раз в секунду дает повторяющиеся результаты.
Но разве следующий пример не будет приемлемым решением?
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() << " ";
}
}
т.е. даже несмотря на то, что конструктор MyRand
: s вызывается несколько раз в быстрой последовательности, каждый вызов srand
имеет другой параметр. Очевидно, что это не потокобезопасно, но опять же, rand
тоже.
MyRand
, гдеMyRand
может моделировать кристалл. Но с другой стороны, если мы таким же образом построим колесо фортуны, подбрасывание монет и т. Д., Мы получим много семян. - person kvadevack   schedule 10.06.2009