8
votes

Quelle est la bonne façon d'utiliser la fonction rand () en C ++?

Je fais un exercice de livre qui dit écrire un programme qui génère des numéros PsueDorandom. J'ai démarré simple avec. XXX

J'ai remarqué que chaque fois que le programme était exécuté, il y aurait la même sortie "aléatoire". Donc, j'ai examiné les générateurs de nombres aléatoires et j'ai décidé d'essayer d'ensemencer en y compris celui-ci d'abord à Randint (). xxx

qui vient de générer le même numéro (je me sens stupide maintenant pour la mise en oeuvre.)

alors je pensais que je serais intelligent et implémenter la graine comme celle-ci. xxx

Ceci a fait la même chose que le Le programme a fait en premier lieu, mais a suscité un ensemble de nombres différent (ce qui a du sens puisque le premier nombre généré par Rand () est toujours 41.)

la seule chose que je pouvais penser à rendre cela plus aléatoire est de:

  1. Demandez à l'utilisateur de saisir un numéro et définissez cela comme la graine (qui serait facile à mettre en œuvre, mais c'est un dernier recours) Ou
  2. en quelque sorte que la graine soit réglée sur l'horloge de l'ordinateur ou un autre numéro constamment changeant.

    suis-je dans ma tête et dois-je m'arrêter maintenant? L'option 2 est-elle difficile à mettre en œuvre? Toute autre idée?

    Merci d'avance.


0 commentaires

5 Réponses :


29
votes

L'option 2 n'est pas difficile, voici:

srand(time(NULL));


3 commentaires

Vous pouvez également lire dans / dev / dev / aléatoires si vous êtes dans un environnement * Nix; Mais je suis d'accord avec le jeton, il s'agit d'une pratique standard pour définir Srand avec la fonction de temps.


Aussi, appelez Srand () dans la principale près du sommet depuis que vous ne devriez l'appeler qu'une fois. Ne l'appelez pas à chaque fois que vous générez un nouveau numéro.


Le point ici est que pour une graine donnée, Rand () produira la même séquence de nombres aléatoires. Donc, si vous souhaitez une séquence différente de nombres aléatoires chaque fois que votre programme est exécuté, vous devez fournir une graine différente à chaque course. C'est le point d'utiliser l'heure actuelle comme la graine.



6
votes

Il est courant de semer le générateur de nombres aléatoires avec l'heure actuelle. Essayez:

srand (heure (null));


0 commentaires

8
votes

srand () ne doit être utilisé qu'une seule fois: xxx


0 commentaires

4
votes

Le problème est que si vous ne grignez pas le générateur, il se grincera avec 0 (comme si srand (0) a été appelé). Les PRNG sont conçus pour générer la même séquence lors de l'ensemencement de la même manière (en raison du fait que les PNRG ne sont pas vraiment aléatoires, ce sont des algorithmes déterministes et peut-être un peu parce qu'il est assez utile pour les tests).

Quand vous essayez de GRAINe avec un nombre aléatoire utilisant xxx

Vous faites en effet: xxx

comme Figbug mentionné , en utilisant le temps nécessaire pour semer le générateur est couramment utilisé. < / p>


1 commentaires

En fait, la valeur de la graine initiale est 1: "si rand () est appelé avant tout appel de SRAND est effectué, la même séquence doit être générée comme lorsque Srand est d'abord appelé avec une valeur de graine de 1. " opengroup.org/onlinePubs/000095399/fonctions/srand.html



0
votes

Je pense que le point de ces articles est d'avoir une option pour mettre en œuvre l'algorithme qui est en rand () et non comment la graver efficacement.

Les nombres aléatoires produisant (pseudo) sont non triviaux et méritent d'enquêter sur différentes techniques de leur générer. Je ne pense pas que simplement utiliser Rand () est ce que les auteurs avaient à l'esprit.


0 commentaires