Как генерировать отрицательное случайное целое число в С++

Вопрос: Я написал функцию, которая принимает целые числа. Он не будет сбой, если пользователь наберет, например, -5, но он преобразует его в положительный = - ( int getRandoms(int size, int upper, int lower) { int randInt = 0; randInt = 1 + rand() % (upper -lower + 1); return randInt; } Что я должен изменить

Вопрос:

Я написал функцию, которая принимает целые числа. Он не будет сбой, если пользователь наберет, например, -5, но он преобразует его в положительный = – (

int getRandoms(int size, int upper, int lower) { int randInt = 0; randInt = 1 + rand() % (upper -lower + 1); return randInt; }

Что я должен изменить в функции для создания случайных отрицательных целых чисел? Пользователь вводит диапазон.

Ответ №1

Для числа в закрытом диапазоне [lower,upper] вы хотите:

return lower + rand() % (upper — lower + 1); // NOT 1 + …

Это будет работать для положительных или отрицательных значений, если upper значение больше или равно lower.

Ваша версия возвращает числа из диапазона того же размера, но начиная с 1 а не lower.

Ответ №2

Есть два ответа на этот вопрос, если вы используете С++ 11, тогда вы должны использовать uniform_int_distribtion, предпочтительнее, например, по многим причинам. Почему люди говорят, что при использовании генератора случайных чисел существует ошибка по модулю? это один пример и ранд(). Рассмотрение Вредная презентация дает более полный набор причин. Вот пример, который генерирует случайные целые числа от -5 to 5:

#include <iostream> #include <random> int main() { std::random_device rd; std::mt19937 e2(rd()); std::uniform_int_distribution<int> dist(-5, 5); for (int n = 0; n < 10; ++n) { std::cout << dist(e2) << «, » ; } std::cout << std::endl ; }

Если С++ 11 не является опцией, то метод, описанный в C FAQ в разделе Как я могу получить случайные целые числа в определенном диапазоне? это путь. Используя этот метод, вы должны сделать следующее для генерации случайных целых чисел из [M, N]:

M + rand() / (RAND_MAX / (N — M + 1) + 1) Ответ №3

Вы также можете использовать Boost.Random, если вы не против зависимости. http://www.boost.org/doc/libs/1_54_0/doc/html/boost_random.html

Ответ №4

Вы хотите начать с вычисления диапазона чисел, поэтому (например) -10 – +5 – это диапазон 15.

Вы можете вычислить числа в этом диапазоне с таким кодом:

int rand_lim(int limit) { /* return a random number in the range [0..limit) */ int divisor = RAND_MAX/limit; int retval; do { retval = rand() / divisor; } while (retval == limit); return retval; }

Сделав это, получение чисел в правильном диапазоне довольно тривиально: добавьте нижнюю границу к каждому номеру, который вы получите.

Обратите внимание, что С++ 11 добавил как генераторы случайных чисел, так и классы распределения, которые могут позаботиться об этом.

Если вы попытаетесь сделать это самостоятельно, когда вы уменьшите число до диапазона, вам очень нужно использовать цикл, как показано выше, чтобы избежать перекоса. По сути, любая попытка просто использовать деление или остаток сама по себе почти неизбежно вводит в заблуждение результат (т.е. Некоторые результаты будут происходить чаще, чем другие).

Ответ №5

Вам нужно всего лишь суммировать нижнюю границу диапазона [lbound, ubound]:

int rangesize = ubound — lbound + 1; int myradnom = (rand() % rangesize) + lbound;

Оцените статью
Добавить комментарий