Ich war überrascht, dass die Ausgabe dieses Programms:Wie viele Zufallszahlen verwendet 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;
}
ist 0
- d.h. std::uniform_real_distribution
zwei Zufallszahl verwendet einen Zufall double
Wert im Bereich [0,1) zu erzeugen. Ich dachte, es würde nur einen generieren und das skalieren. Nachdem ich darüber nachgedacht habe, denke ich, dass dies daran liegt, dass std::mt19937
32-Bit-Ints erzeugt und Double ist doppelt so groß und daher nicht "zufällig genug".
Frage: Wie finde ich diese Zahl generisch, d. H. Wenn der Zufallszahlengenerator und der Fließkommatyp beliebige Typen sind?
Edit: Mir ist gerade aufgefallen, dass ich stattdessen std::generate_canonical
verwenden konnte, da ich nur an Zufallszahlen von [0,1] interessiert bin. Nicht sicher, ob dies einen Unterschied macht.
Sie können dies nicht allgemein finden. –
@ R.MartinhoFernandes: weil ... – arne
Denken Sie darüber nach, was es bedeuten würde, eine 32-Bit-Ganzzahl zu einem 64-Bit-Doppelbild zu "rescale": Es gibt ungefähr 2^62 verschiedene Doppelwerte. Es gibt 2^32 verschiedene int-Werte. Dies bedeutet, dass nur ** eine von jeder Milliarde ** möglichen doppelten Werten in dem resultierenden Doppel darstellbar wäre. Dies ist eindeutig inakzeptabel. – JohannesD