Я делаю объект функции шаблонов, который будет генерировать случайное случайное число. Я знаю, как это сделать для целых чисел или для поплавков. Но моя проблема в том, что я хочу, чтобы он мог генерировать случайное число ранжированного типа T.
Поэтому, поскольку я хочу, чтобы он мог возвращать как числа с плавающей точкой, так и целые числа, я не могу использовать оператор%. Кажется, это работает для значений с плавающей точкой. Но если 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(); }
Других решений пока нет …