Sono rimasto sorpreso di vedere che l'uscita di questo programma:Quanti numeri casuali usa std :: uniform_real_distribution?
#include <iostream>
#include <random>
int main()
{
std::mt19937 rng1;
std::mt19937 rng2;
std::uniform_real_distribution<double> dist;
double random = dist(rng1);
rng2.discard(2);
std::cout << (rng1() - rng2()) << "\n";
return 0;
}
è 0
- vale a dire std::uniform_real_distribution
utilizza due numeri casuali per produrre un double
valore casuale nell'intervallo [0,1). Pensavo che ne avrebbe generato uno e lo avrei ridimensionato. Dopo averci pensato, immagino che questo sia dovuto al fatto che lo std::mt19937
produce inte a 32 bit e che il doppio è doppio di questa dimensione e quindi non "abbastanza casuale".
Domanda: Come faccio a trovare questo numero in modo generico, vale a dire se il generatore di numeri casuali e il tipo a virgola mobile sono tipi arbitrari?
Modifica: Ho appena notato che potrei usare std::generate_canonical
invece, dato che sono interessato solo a numeri casuali di [0,1). Non sono sicuro se questo faccia la differenza.
Non è possibile trovare questo genericamente. –
@ R.MartinhoFernandes: perché ... – arne
Per inciso, pensa a cosa significherebbe "ridimensionare" un numero intero a 32 bit in un doppio a 64 bit: ci sono circa 2^62 valori doppi distinti. Ci sono 2^32 valori int distinti. Ciò significa che solo ** un doppio su ogni ** ** possibile doppio valore sarebbe rappresentabile nel doppio risultante. Questo è chiaramente inaccettabile. – JohannesD