Если я не укажу srand(), какое семя использует rand()?

Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int r;
    int i;
    for (i = 0; i < 100; i++)
    {
        r = rand() % 100 + 1;
        printf("%d\n", r);
    }
    return 0;
}

Я пытался использовать случайное число, но однажды я забыл ввести srand(), но функция rand() все еще может случайным образом (та же самая последовательность).

Вопрос в том, какое семя он использует, если я его не укажу?


person milo64    schedule 10.01.2013    source источник


Ответы (5)


Если srand не вызывается, rand действует так, как если бы был вызван srand(1).

http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#rand

person Community    schedule 10.01.2013

Стандарт C фактически определяет поведение, задокументированное в других ответах:

ISO/IEC 9899:2011 §7.22.2.2 Функция srand

¶2 [...] Если rand вызывается до того, как были сделаны какие-либо вызовы srand, должна быть сгенерирована та же последовательность, что и при первом вызове srand с начальным значением 1.

person Jonathan Leffler    schedule 10.01.2013

На man страницах указано следующее:

Функция srand() устанавливает свой аргумент в качестве начального значения для новой последовательности псевдослучайных целых чисел, которые должны быть возвращены функцией rand(). Эти последовательности можно повторять, вызывая srand() с одним и тем же начальным значением.

Если начальное значение не указано, функция rand() автоматически заполняется значением 1.

person jman    schedule 10.01.2013

If rand() is called before any calls to srand() are made, the same sequence shall 
be generated as when srand() is first called with a seed value of 1.

Ссылка:

http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html

person Adeel Ahmed    schedule 10.01.2013

Функция srand() устанавливает свой аргумент в качестве начального значения для новой последовательности псевдослучайных целых чисел, которые должны быть возвращены функцией rand(). Эти последовательности можно повторять, вызывая srand() с одним и тем же начальным значением.

Если начальное значение не указано, функция rand() автоматически заполняется значением 1.

person Chirag Shah    schedule 10.01.2013
comment
Добро пожаловать в Stack Overflow. То, что вы здесь говорите, правильно, но оно очень сильно повторяет то, что говорят другие, более ранние ответы. На этот раз я дам вам презумпцию сомнения и голосую за, но когда на вопрос уже есть ряд ответов, которые дают ту же информацию, что и вы добавите, вам следует подумать о том, следует ли вам добавить свой ответ. (Когда я добавил свой ответ, уже было два хороших ответа; мой, однако, добавил авторитетную ссылку на то, почему функции ведут себя так, а не иначе — цитату из стандарта C. Именно благодаря этой отличительной информации я вообще добавил ответ. ) - person Jonathan Leffler; 10.01.2013
comment
Извините, не понял, что ответ уже был там. Не буду повторять это впредь. Спасибо, что указали на ошибку. - person Chirag Shah; 14.01.2013