Perché u
nel programma di seguito è sempre infinito?Perché tutti i numeri casuali generati tra il minimo() e il massimo() sono uguali all'infinito?
#include <random>
#include <limits>
int main()
{
auto seed = std::random_device()();
std::mt19937 randomEngine(seed);
const double lo = std::numeric_limits<double>::lowest(); // ~= -1.8e+308
const double hi = std::numeric_limits<double>::max(); // ~= 1.8e+308
std::uniform_real_distribution<> U(lo, hi);
double u = U(randomEngine); // always 1.#INF000000000000
return 0;
}
E 'chiaramente qualcosa a che fare con la gamma passato a std::uniform_real_distribution
. Se lo passo (lo,0)
o (0,hi)
genera numeri casuali finiti, ma perché?
Hmya, non farlo. L'intervallo lo..hi non può essere espresso in un numero di puntatore mobile, l'overflow sta andando a scattare all'infinito. Questo è molto simile a un problema XY, che tipo di algoritmo pensa che 1.8E + 308 sia un numero casuale utile, ma 2.0E + 308 no? –
@HansPassant grazie, e re il problema XY, questo è un esempio minimale che dimostra un problema che ho riscontrato durante il tentativo di scrivere un programma di test per la domanda [Test della casualità (uniformemente distribuito) su un generatore casuale a virgola mobile a 64 bit] (http : //stats.stackexchange.com/questions/92984/test-the-randomness-uniformly-distributed-on-a-64-bit-float-random-generator) su stats.se. – TooTone
@HansPassant, forse puoi dare una risposta al tuo commento? – Dathan