2014-04-08 19 views
13

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é?

+9

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? –

+0

@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

+1

@HansPassant, forse puoi dare una risposta al tuo commento? – Dathan

risposta

19

Secondo N3797:

26.5.8.2.2 [rand.dist.uni.real]

2 Richiede: a ≤ b e b − a ≤ numeric_limits<RealType>::max().

Questa condizione non è soddisfatta poiché b - a è 2 * numeric_limits<double>::max().

Problemi correlati