Как генерировать случайные числа в диапазоне? - PullRequest
0 голосов
/ 22 апреля 2019

Я создаю программу для школы, которая работает следующим образом: пользователь думает о числе, а компьютер пытается его угадать.компьютер генерирует случайное число, спрашивает пользователя, является ли число большим или меньшим, а затем, если число выше, он принимает это число и устанавливает его в качестве минимального значения для диапазона случайных чисел (например, генерирует 47, а затем генерирует числа только между47-100).если число меньше, оно берет сгенерированное случайное число и устанавливает минимальное значение.

Моя проблема с генератором случайных чисел и диапазоном.Я могу сгенерировать случайное число, посеяв его в начале {srand (time (NULL));}, а затем сгенерировать число {rand_num = rand ()% 100;} генерирует число от 1 до 100.но я не могу понять, как сгенерировать число в диапазоне (пример 47-89).Я думал, что это {rand_num = rand ()% 89 + 47}, но, похоже, это не работает.

Github: https://gist.github.com/EthanA2020/e121b27ab80fa6e2d32df1396e62b632

{

    srand(time(NULL));
    do {
    rand_num=rand()%47+89;
    cout << rand_num << endl;
    cout << "enter: "; cin >> userquitval;
    }while (userquitval!=7);
}

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

Чтобы сгенерировать случайное число в C ++ 11 или более поздней версии, используйте случайную библиотеку C ++.Это должно быть гораздо предпочтительнее, чем утилиты C для любого приложения.

#include <random>
#include <iostream>

int main() {
  std::random_device seed;
  std::mt19937 gen{seed()}; // seed the generator
  std::uniform_int_distribution<int> dist;

  dist.param({47, 89}); // set min and max
  int guess = dist(gen); // generate number
  std::cout << “Computer guess: “ << guess << ‘\n’;
}

Прочтите соответствующую страницу cppreference для получения дополнительной информации.

1 голос
/ 22 апреля 2019

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

rand_num=rand()%(90-47)+47;

Как упоминалось Джеспером, это вводит смещение.Чтобы понять это, подумайте, что произойдет, если вам нужно число, равное 0 или 1, а диапазон рандов равен [0, 1, 2].С помощью приведенной выше формулы вероятность получения 0 будет 0,66, а вероятность получения 1 будет 0,33).

Чтобы преодолеть эту проблему, вы можете использовать следующую формулу, которая масштабирует случайное число доплавать в интервале [0,1], а затем использовать его для генерации нужного вам числа.

(double) uniform = (double) rand() / (double) RAND_MAX;
rand_num = (int) ((90.0 - 47.0)*uniform) + 47);
...