principale .cpp aléatoire_gemerator.h p> stdafx.h p> Chaque fois que je l'exécute, il génère tous la même séquence de numéro p> comme 77, 33,5, 22, ... p> Comment utiliser Boost: aléatoire correctement? P> C'est ça. Mais peut-être avoir un petit problème, comme ce qui suit: p> Il semble que sonore p> Il a généré le même nombre aléatoire p>
4 Réponses :
Vous devez semer votre générateur de nombres aléatoires afin qu'il ne commence pas du même endroit à chaque fois. P>
Selon ce que vous faites avec les chiffres, vous devrez peut-être réfléchir à la manière dont vous choisissez votre valeur de graine. Si vous avez besoin d'aléatoire de haute qualité (si vous générez des touches cryptographiques et que vous les souhaitez assez sécurisez), vous aurez besoin d'une bonne valeur de semences. Si c'était POSIX, je vous suggérerais / dev / de dev / aléatoire - mais vous cherchez à utiliser Windows, donc je ne suis pas sûr de quelle bonne source de semences serait. P>
Mais si cela ne vous dérange pas une graine prévisible (pour les jeux, les simulations, etc.), une graine rapide et sale est l'horodatage actuel renvoyé par heure (). P>
T'as raison. Si la graine est la même, le générateur commencera par le même nombre aléatoire à chaque fois
c'est ça. Mais peut-être avoir un petit problème, comme ce qui suit: il semble sonner get_sed (); pour (;;) {COUT << Generate_Random () << endl; } // est ok il a généré le même nombre aléatoire INT get_random () {get_seed (); retour générate_random ();} pour (;;) {COUT << GET_RANDOM () << Endl;} // Sortie du même nombre aléatoire encore
Générez une graine chaque fois que la fonction est appelée. vs utiliser la même graine à chaque fois, qui est la même graine? Pourquoi j'ai la même séquence de numéro aléatoire de la manière première
Consultez mon commentaire sur Chris pour l'abstraction pour une source aléatoire de haute qualité sous Windows.
Si vous souhaitez que la séquence de nombres aléatoires change chaque fois que vous exécutez votre programme, vous devez modifier la graine aléatoire en l'initialisant avec l'heure actuelle, par exemple
Vous trouverez un exemple Il , extrait: p>
c'est ça. Mais peut-être avoir un petit problème, comme ce qui suit: il semble sonner get_sed (); pour (;;) {COUT << Generate_Random () << endl; } // est ok il a généré le même nombre aléatoire INT get_random () {get_seed (); retour générate_random ();} pour (;;) {COUT << GET_RANDOM () << Endl;} // Sortie du même nombre aléatoire encore
Je préfère initialiser le prng to std :: Time (null) + getpid () code>. Cela garantit que les binaires sont exécutés l'une après l'autre, en succession rapide, les PRNG initialisaient différemment.
Pour ajouter "Sécurité", l'approche correcte doit être d'initialiser le PRNG à l'aide de / dev / aléatoires (ou l'équivalent sous Windows .)
Si vous exécutez sur un système NIX, vous pouvez toujours essayer quelque chose comme celui-ci;
int getSeed() { ifstream rand("/dev/urandom"); char tmp[sizeof(int)]; rand.read(tmp,sizeof(int)); rand.close(); int* number = reinterpret_cast<int*>(tmp); return (*number); }
C'est la bonne idée. Notez que dans les nouvelles versions de boost au moins, tout cela est abstrait pour vous par aléatoire_device code>. En tant que bonus,
aléatoire_device code> doit également être implémenté sous Windows. Malheureusement, si je comprends bien, cela n'est pas mis en œuvre sur BSD, car le BSD / Dev / Urandom n'est pas vraiment non déterministe. Donc, si vous voulez l'interopérabilité de Linux et Windows, je suppose que vous pouvez utiliser
aléatoire_device code> et si vous souhaitez interopérabilité Linux et BSD, vous pouvez utiliser la lecture explicite de / dev / urandom. Si vous voulez une autre combinaison d'interopérabilité, je pense que vous êtes seul!
Vous pouvez utiliser le boost :: aléatoire ::: Random_device classe, soit comme, soit à la graine de votre autre générateur.
Vous pouvez obtenir un numéro aléatoire unique sur celui-ci avec un simple: P>
boost::random::random_device()()
Il semble que cela renvoie le résultat du type non signé INT code> (je me demandais ... il fallait aussi la regarder).