случайное число от -9 до 9 в C ++ - PullRequest
13 голосов
/ 25 октября 2011

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

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

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

Ответы [ 5 ]

29 голосов
/ 25 октября 2011

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

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

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

7 голосов
/ 25 октября 2011

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

Для вашей информации

 rand() % N;

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

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

rand() % 19 + (-9);
6 голосов
/ 25 октября 2011

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

Псевдо-код:

std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)
3 голосов
/ 25 октября 2011

Вы правы в том, что насчитывается 18 счетных чисел от -9 до 9 (включительно).

Но компьютер использует целые числа (набор Z), который включает ноль, что делает его 19 числами.

Минимальное соотношение, которое вы получаете от rand () к RAND_MAX, равно 0, поэтому вам нужно вычесть 9, чтобы получить -9.

Информация ниже не рекомендуется. Это не в manpages aymore. Я также рекомендую использовать modern C ++ для этой задачи.

Также, man-страница для функции 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.));
0 голосов
/ 25 октября 2011

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

...