Как присвоить переменную rand () в C?

Возможный дубликат:
Сгенерировать случайное число в пределах диапазона?

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

Я правильно сделал?

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


int main()
{
    int randomnumber ;
    int max;
    srand( time(NULL) );
    scanf("Enter total number of students %d",&max);
    randomnumber=rand()% 30;
    printf("This is your random number\n %d",randomnumber);
    getchar();
    return 0;
}

person Tohrik    schedule 16.01.2013    source источник
comment
Сделайте это: randomnumber = rand()% max;   -  person sgarizvi    schedule 16.01.2013
comment
Прочтите eternalconfuzzled.com/arts/jsw_art_rand.aspx   -  person banuj    schedule 16.01.2013
comment
Modulo не очень повезло с этим. Проверьте stackoverflow.com/a/9515646/1168156   -  person LihO    schedule 16.01.2013


Ответы (1)


Вы использовали scanf для отправки сообщения пользователю, но для этого вам нужно использовать printf. Пытаться:

printf("%s", "Enter total number of students: ");
scanf("%d",&max);

Затем вы можете изменить %30 на %max, чтобы дать пользователю номер от 0 до max - 1.

randomnumber=rand()% max;

Как сказали комментаторы, использование по модулю для уменьшения диапазона rand() не даст вам хорошего случайного распределения. Также не забудьте проверить, что max больше 0, иначе вы получите ошибку.

Если вам интересно, почему вы получаете большое число в max в данный момент, то это потому, что вы не инициализируете max явно. С C и C ++ это означает, что там могут быть ненужные данные. Это не похоже на Java или C #, где int автоматически инициализируется значением 0.

person Steve    schedule 16.01.2013
comment
Хотя стоит упомянуть, что это будет иметь смещение, если max не делит RAND_MAX. - person Frank; 16.01.2013
comment
Когда я меняю его на% max, он делает не то, что я хочу. Когда я ввожу 20, это дает мне какое-то число больше 20, а не меньше. - person Tohrik; 16.01.2013
comment
@Tohrik Тогда ты сделал что-то не так. Обратите внимание, что никто из вас не проверяет, действительно ли scanf считывает правильный номер, который вы вводите, поэтому вы должны убедиться, что scanf () не возвращает ошибку, и во время отладки также поможет, если вы распечатаете max, чтобы вы могли сделать уверен, что это ценность, которую вы думаете. - person nos; 16.01.2013
comment
Также стоит отметить, что ввод-вывод, такой как scanf(), может завершиться ошибкой. - person unwind; 16.01.2013
comment
Мне интересно, почему он поместил заполнитель в printf. - person Tohrik; 17.01.2013
comment
Поскольку неправильное использование printf может привести к уязвимостям строки формата. В этом случае это не является строго необходимым, но я обнаружил, что указание заполнителя - хорошая привычка, поскольку становится легче обнаружить неправильное использование. - person Steve; 17.01.2013