Я создаю объект функции шаблонов, который будет генерировать случайное число в диапазоне. Я знаю, как это сделать для int или floats. Но моя проблема в том, что я хочу, чтобы он мог генерировать случайное число в диапазоне от типа T.
Поэтому, поскольку я хочу, чтобы он мог возвращать как поплавки, так и целые числа, я не могу использовать оператор%. Кажется, что это работает для значений float. Но если T - INT, это испортит диапазон.
return (_minValue + (T)rand() / ((T)RAND_MAX / (_maxValue - _minValue)));
В этом алгоритме должна быть какая-то ошибка, которую я просто не могу найти в этот час.
Если тип T
является целым типом, то (T)rand()/(T)RAND_MAX
будет явно нулевым, за исключением редкого случая, когда rand()
возвращает RAND_MAX
(и T
, по крайней мере, как int
), и в этом случае будет один. Обратите внимание, что rand()
как правило, не очень хороший генератор случайных чисел, хотя качество отличается от разных реализаций. Вероятно, вам лучше всего использовать что-то из библиотеки <random>
(для моей обычной работы мне очень редко приходится использовать случайные числа, т.е. Я не знаю, как сразу использовать компоненты в этой библиотеке).
Если вы настаиваете на использовании rand()
ваш лучший вариант - это, вероятно, определение случайных значений, отличных для целых чисел и плавающих точек, например:
template <typename T, bool = std::is_floating_point<T>::value>
struct random;
template <typename T>
struct random<T, true> {
static T generate() { return /* floating point formula goes here */; }
};
template <typename T>
struct random<T, false> {
static T generate() { return /* integer formula goes here */; }
};
template <typename T>
T random_range() { return random<T>::generate(); }