Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > то ли srand(ltime)/rand() подводит, завуалированая


Автор: Royan 28.11.2005, 03:31
Проблема такая.

Мне необходимо заполнить вектор элементами:


Код

    for(unsigned int i = 0; i < 10; i++) {
        _Ty obj;
        my_vector.push_back(obj);
    }

_Ty это шаблонный параметр. При инициализации объекта obj вызывается конструктор, который выглядит примерно так:

Код

CObj::CObj() {
    time_t ltime;
    time(&ltime);
    srand(ltime);
    randomVal = (double) rand() / RAND_MAX;
}



Однако, при распечатке оказывается, что все 10 сгенерированных объектов имеют одно и то же случайное число. Вопрос, почему так происходит (тривиальное объяснение слишком быстро проходит этап генерации и для всех десяти используется одно и то же страмляющее зерно, в результате последовательность, генерируемая rand() всякий раз одна и та же).

И если это так то как этого избежать?
Добавлено @ 03:40
Собственно решение, которое придумалось буквально только что:

Код

CObj::CObj() {
    static long i = 10;
    time_t ltime;    
    time(&ltime);
    srand(ltime + i);
    activation = (double) rand() / RAND_MAX;
    i+=ltime;
}

Автор: Mad 28.11.2005, 04:28
Цитата(Royan @ 28.11.2005, 02:31)
static long i = 10;

Зачем так сложно, достаточно вызвать srand один раз при запуске программы smile

Автор: Chaos A.D. 28.11.2005, 10:22
Цитата(Royan @ 28.11.2005, 03:31)
Вопрос, почему так происходит (тривиальное объяснение слишком быстро проходит этап генерации и для всех десяти используется одно и то же страмляющее зерно, в результате последовательность, генерируемая rand() всякий раз одна и та же).


Ну да, так и есть. std::time возвращает одинаковое значение всю секунду. Так что совет Mad-а тебе поможет.

Автор: Guest 28.11.2005, 11:16
А как параметр srand достаточно передать time(NULL).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)