std ::iform_real_distribution — получить все возможные числа

Я хотел бы создать 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 Кажется, неверные аргументы. Как мне это исправить?

1

Решение

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, то отрицательное действительное значение.

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

4

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

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

По вопросам рекламы [email protected]