Я изучаю C и хочу сгенерировать число от 0 до 6400. Вот код, который я придумал:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int i = (rand() % 6401);
printf("Random number between 0 and 6400: %d\n", i);
return 0;
}
Когда я компилирую и запускаю этот код из командной строки, я получаю очень странные результаты:
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6282
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6282
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6285
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6285
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6289
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6289
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6292
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6292
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6295
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6298
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6298
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6302
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6302
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6305
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6305
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6308
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6308
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6311
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6311
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6315
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6315
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6318
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6318
K:\C\Labo\Oefeningen 2019>a
Random number between 0 and 6400: 6321
K:\C\Labo\Oefeningen 2019>
Цифры все разные, но я ожидаю более равномерного распределения между 0 и 6400. Странно то, что я без проблем использовал ту же функцию час назад? (Раньше я использовал его для генерации меньших чисел.) Я уверен, что это что-то действительно глупое, чего мне не хватает, но я застрял уже на час.
РЕДАКТИРОВАТЬ: я знаю, что это даст то же значение, когда вы запустите код в течение той же секунды. Я ждал несколько секунд (10-20) между выполнениями и все равно получаю тот же результат? Значения редко бывают одинаковыми, они просто очень-очень похожи в 100% случаев. Как мне обойти это?
time(0)
возвращает количество секунд, прошедших с 1970 года. Его значение должно меняться каждую секунду. Поэтому, если вы запустите эту программу более одного раза в секунду, вы можете получить одинаковые результаты. Но по прошествии времени значения не должны быть одинаковыми. Вы можете добавить вывод этой функции в консоль для сравнения. Если вам нужны доли секунды, вы можете использоватьgettime
, для которого в качестве параметра требуется указатель структуры. - person Andrew   schedule 29.09.2019