I've got a line:
std::uniform_real_distribution<T> distribution(std::numeric_limits<T>::lowest(),
std::numeric_limits<T>::max());
It compiles but crashes on Debug(VS 2017CE). My guess is that, according to documentation of std::uniform_real_distribution
:
Requires that
a ≤ b
andb-a ≤ std::numeric_limits<RealType>::max()
when my b
is ::max()
and a
is ::lowest()
, condition:
b-a ≤ std::numeric_limits<RealType>::max()
is not fulfilled as b-a
basically doubles the value of max
. Is there any work around for this so that I will keep such a wide numbers range? ::min()
works perfectly but omits negative values. Problem occurs for floating numbers only.
One simple solution, at least for the common IEEE-754 floating point numbers, would be randomly flipping the sign of a random non-negative number:
where
someRandomFlag
is chosen uniformly from{true, false}
.One way to do this is to use the range
[-1, 1]
and then multiply that bystd::numeric_limits<T>::max()
to get the actual number. This lets you satisfy theb-a ≤ std::numeric_limits<RealType>::max()
requirement.This won't give you all possible floating point values but it will give you a good number of them distributed like a
uniform_int_distribution
would.