Я хотел бы создать std::uniform_real_distribution
возможность генерировать случайное число в диапазоне [MIN_FLOAT, MAX_FLOAT]
, Ниже приведен мой код:
#include <random>
#include <limits>
using namespace std;
int main()
{
const auto a = numeric_limits<float>::lowest();
const auto b = numeric_limits<float>::max();
uniform_real_distribution<float> dist(a, b);
return 0;
}
Проблема в том, что когда я запускаю программу, она прерывается, потому что a
а также b
Кажется, неверные аргументы. Как мне это исправить?
uniform_real_distribution
Конструктор требует:
a ≤ b
а такжеb − a ≤ numeric_limits<RealType>::max()
,
Это последнее не возможно для вас, так как разница между lowest
а также max
по определению должен быть больше чем max
(и почти наверняка будет INF).
Есть несколько способов решить эту проблему. Самое простое, как отметил Натан, это просто использовать uniform_real_distribution<double>
, Если не double
для вашей реализации не может хранить диапазон float
(и IEEE-754 Float64 могут хранить диапазон Float32), это должно работать. Вы все равно проходите мимо numeric_limits
для float
, но так как дистрибутив использует double
, он может обрабатывать математику для увеличения дальности.
В качестве альтернативы, вы можете объединить uniform_real_distribution<float>
с логическим значением uniform_int_distribution
(то есть тот, который выбирает от 0 до 1). Ваше реальное распределение должно быть по положительным числам, до max
, Каждый раз, когда вы получаете число из реального дистрибутива, получайте его и из дистрибутива int. Если целое число равно 1, то отрицательное действительное значение.
Это имеет обратную сторону: вероятность нуля немного выше, чем вероятность других чисел, поскольку положительный и отрицательный ноль — это одно и то же.
Других решений пока нет …