Подтвердить что ты не робот

Случайное число от -9 до 9 в С++

просто интересно, если у меня есть следующий код:

int randomNum = rand() % 18 + (-9);

это создаст случайное число от -9 до 9?

4b9b3361

Ответ 1

Нет, не будет. Вы ищете:

int randomNum = rand() % 19 + (-9);

Существует 19 различных целых чисел от -9 до +9 (включая оба), но rand() % 18 предоставляет только 18 возможностей. Вот почему вам нужно использовать rand() % 19.

Ответ 2

Ваш код возвращает число между (0-9 и 17-9) = (-9 и 8).

Для информации

 rand() % N;

возвращает число от 0 до N-1:)

Правильный код

rand() % 19 + (-9);

Ответ 3

Не забывайте, что новая псевдослучайная функция С++ 11 могла бы быть вариантом, если ваш компилятор уже поддерживает ее.

Псевдо-код:

std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)

Ответ 4

Вы правы в том, что существует 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.));

Ответ 5

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