Случайное число в пределах диапазона для Float ИЛИ Int

Я делаю объект функции шаблонов, который будет генерировать случайное случайное число. Я знаю, как это сделать для целых чисел или для поплавков. Но моя проблема в том, что я хочу, чтобы он мог генерировать случайное число ранжированного типа T.

Поэтому, поскольку я хочу, чтобы он мог возвращать как числа с плавающей точкой, так и целые числа, я не могу использовать оператор%. Кажется, это работает для значений с плавающей точкой. Но если T — INT, это испортит диапазон.

return (_minValue + (T)rand() / ((T)RAND_MAX / (_maxValue - _minValue)));

В этом алгоритме должна быть какая-то ошибка, которую я не могу найти в этот час.

0

Решение

Если тип 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(); }
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector