#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;
}