C: srand не влияет на генератор случайных чисел

У меня есть следующий код c:

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

int main(int argc, char *argv[]) {
  srand(time(NULL));
  printf("%d\n", (int)random());
  return 0;  
}

Насколько я понимаю, это должно печатать разные случайные числа каждый раз, когда я запускаю программу, потому что случайное начальное число зависит от системного времени.

Но каждый раз при запуске программы я получаю один и тот же вывод:

1804289383

Я по-прежнему получаю тот же результат, когда добавляю пользовательские значения в качестве аргумента для srand:

srand(1);

Or

srand(12345);

У кого-нибудь есть идея, почему это происходит? Может быть, это из-за моей операционной системы (Mac OS 10.10.3)? Или компилятор, который я использую (gcc)?

Есть ли простые альтернативы?


person Rafael Bankosegger    schedule 13.05.2015    source источник
comment
Что такое random()? Может быть, он отвязан от srand()? Или вы хотели использовать rand()? Вам нужно srandom(), чтобы установить начальное число для random().   -  person juanchopanza    schedule 13.05.2015
comment
srand устанавливает начальное число для rand, а не для random, для которого есть srandom.   -  person M Oehm    schedule 13.05.2015
comment
Спасибо эм. Кажется, это работает. Вы хотите написать ответ, чтобы я мог дать вам баллы?   -  person Rafael Bankosegger    schedule 13.05.2015
comment
Даже если вы использовали правильное заполнение, у вас все еще есть проблема, заключающаяся в том, что вы генерируете только одно число. Нет такой вещи, как одно рандомное число — у вас будет хеш-функция начального числа.   -  person Lee Daniel Crocker    schedule 13.05.2015


Ответы (2)


Ну, ваша проблема здесь связана с несколькими способами создания случайных чисел в C со стандартными библиотеками.

По сути, есть два набора функций для генерации случайного числа:

Из руководства rand(3):

   #include <stdlib.h>

   int rand(void);
   int rand_r(unsigned int *seedp);
   void srand(unsigned int seed);

Из руководства random(3):

   #include <stdlib.h>

   long int random(void);

   void srandom(unsigned int seed);

   char *initstate(unsigned int seed, char *state, size_t n);
   char *setstate(char *state);

Вы должны просто выбрать тот, который лучше всего соответствует вашим потребностям. Я приглашаю вас продолжить чтение этих руководств для получения дополнительной информации ;-)

person Pierre Podevin    schedule 13.05.2015
comment
srand и rand определены стандартом ISO C и существуют во всех реализациях C. srandom и random определены POSIX и менее переносимы (но, вероятно, будут более высокого качества, чем srand/rand). - person Keith Thompson; 22.02.2017

Стандартным генератором случайных чисел в C является rand(), который может быть заполнен srand(seed).

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

Так что просто выберите правильную пару функций заполнения и ГСЧ.

person M Oehm    schedule 13.05.2015