2016-03-29 4 views
6

come potrei generare un seed o un hash che renderebbe il rand effettivamente casuale? Ho bisogno che cambi ogni volta che prende un numero. Nuovo in C++ quindi non sono esattamente sicuro di come farlo. Grazie! : DCome farei un seme casuale/hash per rendere Rand effettivamente casuale?

+0

@DevanshMohanKaushik - La domanda/risposte di riferimento nel duplicato suggerito è un cattivo suggerimento, poiché sostengono l'uso del tempo come seme - che è una cattiva pratica e può portare a duplicare un numero casuale tra i processi che seminano allo stesso tempo (pensate ai web server) – Soren

+0

@sorren contiene anche i link alle altre risposte utili tra cui quella che avete citato nella sezione di introduzione. – Hummingbird

+0

Questa domanda è per C++ mentre il duplicato contrassegnato richiede C. –

risposta

1

Non esiste un generatore di numeri casuali "effettivamente casuale" senza campionamento di dati ambientali o accesso a una fonte numerica di numeri casuali. Considera l'accesso alla fonte di numeri casuali ANU se hai bisogno di numeri veramente casuali (http://qrng.anu.edu.au/FAQ.php#api).

In caso contrario, Boost fornisce una più robusta pseudo-RNG, che dovrebbe essere sufficiente per la maggior parte degli scopi: http://www.boost.org/doc/libs/1_58_0/doc/html/boost_random.html

+3

Si noti che gran parte del boost random è stato standardizzato con C++ 11 e si può accedere tramite ''. – Yuushi

5

Con C++ 11 è possibile utilizzare std::random_device. Ti suggerisco di guardare link per una guida completa.

Estrazione del essenziale messaggio dal link video di: Si dovrebbe mai uso srand & rand, ma invece utilizzare std::random_device e std::mt19937 - per la maggior parte dei casi, il seguente sarebbe quello che si vuole:

#include <iostream> 
#include <random> 
int main() { 
    std::random_device rd; 
    std::mt19937 mt(rd()); 
    std::uniform_int_distribution<int> dist(0,99); 
    for (int i = 0; i < 16; i++) { 
     std::cout << dist(mt) << " "; 
    } 
    std::cout << std::endl; 
}