2015-05-08 10 views
5

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?

+1

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

+0

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

+1

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

risposta

4

Dalla pagina cppreference s' sul std::random_device::entropy (sottolineatura mia)

Questa funzione non è pienamente attuato in alcune librerie standard. Ad esempio, gcc e clang restituiscono sempre zero anche se il dispositivo non è deterministico. In confronto, Visual C++ restituisce sempre 32 e restituisce boost.random 10.

+0

Ma * "Come posso testare' std :: random_device' per casualità? "* (Sì, so che si tratta di due domande diverse, potenziate per rispondere a quella del titolo.) –

+1

@BaummitAugen Forse http://stackoverflow.com/questions/28390843/how-to-find-the-true-entropy-of-stdrandom-device? rq = 1 –

+0

@BaummitAugen Ho cambiato il titolo alla domanda reale – vladon