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?
risposta
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
Si noti che gran parte del boost random è stato standardizzato con C++ 11 e si può accedere tramite '
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;
}
@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
@sorren contiene anche i link alle altre risposte utili tra cui quella che avete citato nella sezione di introduzione. – Hummingbird
Questa domanda è per C++ mentre il duplicato contrassegnato richiede C. –