Il seguente codice non sembra comportarsi in modo intuitivo:In che modo le distribuzioni della classe C++ 11 <random> trasformano il generatore sottostante?
#include <random>
#include <iostream>
using namespace std;
int main()
{
mt19937 MyGenerator(40);
auto gauss = normal_distribution<double>(0,1);
auto linear = uniform_real_distribution<double>(0,1);
cout << gauss(MyGenerator) << endl; //line a
cout << linear(MyGenerator) << endl; //line b
cout << gauss(MyGenerator) << endl;
}
L'esecuzione di questo codice dà l'uscita
-0.816097
0.705030
0.303032.
Se ora l'ordine delle linee A e B è scambiato, i cambiamenti di uscita per
0.644008
0.338080
-0.639501.
È del tutto chiaro che i primi due numeri sono diversi ora, poiché sono prodotti da diverse distribuzioni. Tuttavia, perché il terzo numero è diverso? Nella mia intuizione, la distribuzione dovrebbe prendere un numero c = MyGenerator() che viene quindi mappato al numero casuale nell'intervallo specifico. Il generatore di numeri casuali indicherà il numero successivo nella sequenza di numeri dopo la chiamata di distribuzione. Quindi, l'esito della terza chiamata non dovrebbe essere lo stesso in entrambi i casi?
Un'altra osservazione: L'aggiunta di una quarta chiamata a una delle distribuzioni sembra infatti riprodurre gli stessi numeri.
Ho trovato 'aurng()' restituisce sempre 0, che causa il ciclo infinito in GCC 6.1.0. –
@LiDong che non dovrebbe accadere; indica che il tuo URNG è rotto. – ecatmur
Ho posto un'altra domanda in http://stackoverflow.com/questions/38350743/infinite-loop-in-random-tcc-gcc-6-1-0-may-be-bug-in-armadillo –