Позвольте мне начать с рекомендации, что вы должны избегать использования rand
(вообще) и %
для ограничения его выхода определенным диапазоном. В любом случае, если вы действительно настаиваете на этом, перейдите к разделу C Библиотека ниже, чтобы найти способ, по крайней мере, полудумный.
Современная библиотека
C ++ 11 представил новый набор классов для генерации случайных чисел и уменьшения случайных чисел до заданного диапазона. Однако использовать их - смешанный пакет - некоторые части (например, посевные) немного сложнее, в то время как другие (например, сокращение до диапазона) несколько проще - по крайней мере, если вы хотите хорошо выполнять свою работу.
Я бы также отметил, что если 0 n должен быть 2
, а не 1
.
Используя классы генерации случайных чисел в C ++ 11, вы можете сделать что-то в таком общем порядке:
std::mt19937 gen{ std::random_device()() };
// ...
int n = std::uniform_int_distribution<int>(2, 40)(gen);
int x = std::uniform_int_distribution<int>(1, n)(gen);
Если вы действительно заботитесь о качестве случайных чисел, вы можете захотеть go немного дальше, хотя - прямо сейчас, это использует только одно возвращаемое значение из std::random_device
для заполнения генератора, но генератор mt19937 на самом деле имеет гораздо большее состояние, чем это, поэтому большее начальное число будет лучше. Если вы хотите разобраться в этом, вы можете рассмотреть std::seed_seq
в качестве отправной точки.
C Библиотека
Если вы собираетесь используйте rand()
и %
, чтобы уменьшить ваши числа до нужного диапазона, я думаю, я бы начал с написания небольшой функции для генерации случайного числа в указанном диапазоне 1 :
int rand_range(int lower, int upper) {
int range = upper - lower;
return rand() % range + lower;
}
Тогда я бы использовал это для генерации чисел:
n = rand_range(2, 40);
x = rand_range(1, n);
[Как указано выше, нижний предел для n
должен быть равен 2.]
Другая возможность будет чтобы сгенерировать два числа, тогда, если они в неправильном порядке, поменяйте их местами. Это все еще оставляет возможность того, что они равны, и устранение этой возможности было бы большим трудом - таким образом, предыдущий совет просто убедиться, что когда вы генерируете x
, он всегда начинается строго меньше чем n
.
1. Обратите внимание, что если диапазон rand()
не кратен 40
(что маловероятно), использование %
, как это, приводит к смещенным результатам , Если вы хотите добиться большего, вы можете взглянуть на { ссылка }, чтобы найти несколько улучшенный метод, но стандартный дистрибутив, показанный в разделе Modern Library , действительно является правильным способом go здесь.