Как установить границы для генерации случайных чисел
Я новичок в C++ и вообще в программировании. Я пишу игру где игрок загадывает число, а компьютер его пытается угадать. При проверке программы обнаружил, что числа генерируются в таком диапазоне, где это бессмысленно (например: загадано число 50, компьютер предлагает 41, ты говоришь 41 меньше загаданного, дальше компьютер предлагает 25 и это бесполезно т.к. 41 и так меньше) и у меня не получается ограничить этот диапазон. Я пытался сделать переменные max и min и через while проверял больше или меньше случайное число и если не подходит под условие генерируется заново, но у меня не вышло. И важно то, чтобы это ограничение оставалось на протяжении всего игрового цикла. Так вот помогите с написанием ограничения для случайных чисел. Вот код:
P.S. Если что 100 - (100 - num) обозначает генерацию от нуля до num, а num + 100 - (100 - num) от этого числа до 100
'''#include <iostream>
#include <string>
#include <ctime>
using namespace std;
int main() {
int num, min = 101, max = 0, count = 0;
//srand(time(NULL));
num = rand() % 100;
string range;
bool end = true;
while (end) {
cout << "number: " << num << endl;
cout << "number less, greater than or equal to the hidden one?: " << endl;
cin >> range;
if (range == "equal") {
end = false;
cout << "computer won" << endl;
}
if (range == "more") {
num = rand() % (100 - (100 - num));
count++;
}
if (range == "less") {
num = num + rand() % (100 - (100 - num));
count++;
}
}
cout << "guessed in " << count << " attempts" << endl;
system("pause");
return 0;
}'''
Ответы (2 шт):
Проще всего сгенерировать целое случайное число в диапазоне [a;b], т.е. от a до b включительно -
rand()%(b-a+1)+a
Более правильный способ - использование <random> -
std::random_device r;
std::default_random_engine e(r());
std::uniform_int_distribution<int> dist(a,b);
После этого генерация очередного случайного числа с равномерным распределением в диапазоне [a;b] -
int random_number = dist(e);
template <int f, int s >
class Urand {
std::mt19937 en;
std::uniform_int_distribution<int> d{ f, s };
public:
int operator ()() { return d(en); }
};
Можно получать последовательность случайных чисел(возьмем, например диапазон -50 ... 150:
constexpr size_t sz = 10;
int array[sz];
std::generate(array, array + sz, Urand<-50, 150>());
Можно получать такой массив и во время компиляции, но это уже другая тема...