функция random или rand выводит одно и то же значение, даже на разных машинах

#c #random

#c #Случайный

Вопрос:

Я хочу напечатать случайное число в диапазоне от 1 до 6. У меня есть следующий код.

 printf("The random value is %d n",random(6));
  

При каждом запуске кода выводится 1804289383. Даже на разных машинах. Я также попробовал rand (6), результат все тот же. Даже если я удалил 6, результат не меняется. Пожалуйста, предложите, как это исправить

Заранее спасибо

Sanket

Комментарии:

1. Вы вызываете randomize() перед тем, как вызвать random() в первый раз?

2. @Joel, ты имеешь в виду srand()?

3. @mdec Я считаю, что это randomize() вызывает srand(...) внутренне, используя время в качестве начального значения. Но это может не соответствовать ISO. Я комментировал, основываясь на прошлом опыте.

4. @Joel, вызывается ли стандартная библиотечная функция randomize() ? Я быстро просмотрел, но прошу прощения, если я это пропустил.

5. @Joel, без проблем, мне просто интересно, почему я не смог найти документацию 🙂

Ответ №1:

Вы должны были srand() раньше rand() каждый раз генерировать новые числа. Этот код покажет, как это сделать:

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

int main()
{
    srand(time(0));
    printf("The random value is %dn", 1   rand() % 6);
    return 0;
}
  

Комментарии:

1. и убедитесь, что вы используете srand только один раз в своей основной функции!

2. Любому, у кого может быть несколько процессов, запускающихся одновременно, но который хочет, чтобы каждый из них отображал другую последовательность из rand() , может потребоваться сгенерировать что-то, что с большей вероятностью будет уникальным … например srand(time(0) ^ (getpid() << 3) ^ (getpid() >> 2)); . Еще лучше, используйте вместо этого функции случайных чисел C 11 .

Ответ №2:

Прежде всего, random() не принимает никаких аргументов.

Во-вторых, из точного руководства:

Как и rand(), random() по умолчанию выдает последовательность чисел, которую можно дублировать, вызвав srandom() с 1 в качестве начального значения.

Таким образом, если вы явно не укажете начальное значение при вызове, srandom() random() каждый раз будет выдаваться одна и та же последовательность значений.

В-третьих, random() возвращает long , поэтому вы должны использовать %ld в своем printf() вызове.

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

Ответ №3:

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

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

Итак, вот краткий пример:

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

#define RSEED 2

int main (int argc, char *argv[]) {
  srand(RSEED);
  printf("The random value is %dn", rand());
  return 0;
}