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

0

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

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

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

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

Теги:
algorithm
gcc
std
stl

1 ответ

1
Лучший ответ

Если тип T является целым типом, то (T)rand()/(T)RAND_MAX будет явно нулевым, за исключением редкого случая, когда rand() возвращает RAND_MAXT, по крайней мере, как 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(); }
  • 0
    Спасибо. Много узнал из этого ответа. Я забыл, что rand () генерирует число от 0 до 1. Так что я закончил тем, что позволил этому быть плавающим все время, а затем просто бросил его так: return (T) (_ minValue + (float) rand ( ) / ((float) RAND_MAX / (_maxValue - _minValue))); Это не красиво, но это работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню