Supponiamo che io ho questo programma multipiattaformaCome posso testare std :: random_device per casualità?
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::cout << "rd.entropy = " << rd.entropy() << std::endl;
std::uniform_int_distribution<int> dist(0, 9);
for (int i = 0; i < 10; ++i) {
std::cout << dist(rd) << " ";
}
std::cout << std::endl;
}
Su Linux Mint 17.1 con g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
produce sempre numeri casuali:
$ g++ -std=c++11 testrd.cpp -o testrd
$ ./testrd
rd.entropy = 0
9 2 6 0 8 1 0 2 3 8
$ ./testrd
rd.entropy = 0
3 6 2 4 1 1 8 3 7 5
$ ./testrd
rd.entropy = 0
3 4 4 6 8 5 4 6 6 3
$ ./testrd
rd.entropy = 0
2 4 7 7 6 3 0 1 1 9
$ ./testrd
rd.entropy = 0
7 2 5 0 7 8 6 6 0 6
Ma come posso essere sicuro, che su qualsiasi sistema std::random_device
è casuale ? Ad esempio, su Windows con mingw-gcc
è non casuale (vedere, ad esempio this question), esso produrrà la stessa sequenza all'avvio. Ma su MSVC++ (secondo S. Lavavej) a partire dal 2013.4 è è casuale.
ho pensato che posso fare questo:
if (rd.entropy() != 0) {
// initialize some generator like mt19937 with rd()
}
else {
// use another seed generator (for example, time in milliseconds)
}
cioè confrontando rd.entropy() con 0. Ma si scopre di essere sbagliato.
Come è possibile testare std::random_device
in modo casuale?
std :: random_device può essere implementato in termini di un motore di numeri pseudo-casuali definito dall'implementazione, se una fonte non deterministica (ad esempio un hardware dispositivo) non è disponibile per l'implementazione. Un generatore di numeri casuali deterministici (ad esempio un motore pseudo-casuale) ha entropia zero. –
possibile duplicato di [come trovare l'entropia "vera" di std :: random \ _device?] (Http://stackoverflow.com/questions/28390843/how-to-find-the-true-entropy-of-stdrandom -dispositivo) – CoryKramer
Ben test per casualità non dovrebbe essere troppo difficile se si va per l'approccio pragmatico che immagino. Basta generare il valore casuale come 10 volte. Se è identico, le probabilità su quello con un dispositivo casuale sono praticamente pari a zero. – laurisvr