10
votes

boost :: aléatoire générer le même numéro à chaque fois

principale .cpp xxx

aléatoire_gemerator.h xxx

stdafx.h xxx

Chaque fois que je l'exécute, il génère tous la même séquence de numéro

comme 77, 33,5, 22, ...

Comment utiliser Boost: aléatoire correctement?


C'est ça. Mais peut-être avoir un petit problème, comme ce qui suit:

Il semble que sonore xxx

Il a généré le même nombre aléatoire xxx


0 commentaires

4 Réponses :


6
votes

Vous devez semer votre générateur de nombres aléatoires afin qu'il ne commence pas du même endroit à chaque fois.

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.

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 ().


4 commentaires

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.



13
votes

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: xxx < / p>


3 commentaires

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 () . 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 .)



5
votes

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);
}


1 commentaires

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 . En tant que bonus, aléatoire_device 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 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!



2
votes

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()()


1 commentaires

Il semble que cela renvoie le résultat du type non signé INT (je me demandais ... il fallait aussi la regarder).