просто интересно, если у меня есть следующий код:
int randomNum = rand() % 18 + (-9);
это создаст случайное число от -9 до 9?
просто интересно, если у меня есть следующий код:
int randomNum = rand() % 18 + (-9);
это создаст случайное число от -9 до 9?
Нет, не будет. Вы ищете:
int randomNum = rand() % 19 + (-9);
Существует 19 различных целых чисел от -9 до +9 (включая оба), но rand() % 18
предоставляет только 18 возможностей. Вот почему вам нужно использовать rand() % 19
.
Ваш код возвращает число между (0-9 и 17-9) = (-9 и 8).
Для информации
rand() % N;
возвращает число от 0 до N-1:)
Правильный код
rand() % 19 + (-9);
Не забывайте, что новая псевдослучайная функция С++ 11 могла бы быть вариантом, если ваш компилятор уже поддерживает ее.
Псевдо-код:
std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)
Вы правы в том, что существует 18 счетных чисел между -9 и 9 (включительно).
Но компьютер использует целые числа (набор Z), который включает в себя нуль, что делает его 19 чисел.
Минимальное соотношение, которое вы получаете от rand() над RAND_MAX, равно 0, поэтому вам нужно вычесть 9 для перехода на -9.
Кроме того, manpage для функции rand цитирует:
"Если вы хотите генерировать случайное целое число от 1 до 10, вы всегда должны делать это, используя старшие биты, как в
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
и никогда ничем не напоминающим
j = 1 + (rand() % 10);
(который использует младшие разряды).
Итак, в вашем случае это будет:
int n= -9+ int((2* 9+ 1)* 1.* rand()/ (RAND_MAX+ 1.));
В любое время, когда у вас есть сомнения, вы можете запустить цикл, который получает 100 миллионов случайных чисел с вашим исходным алгоритмом, получать наименьшие и самые высокие значения и видеть, что происходит.