Pourquoi rand() aboutissent à la même séquence de nombres sur chaque course?
Chaque fois que je lance un programme avec rand()
il me donne les mêmes résultats.
Exemple :
#include <iostream>
#include <cstdlib>
using namespace std;
int random (int low, int high) {
if (low > high) return high;
return low + (rand() % (high - low + 1));
}
int main (int argc, char* argv []) {
for (int i = 0; i < 5; i++) cout << random (2, 5) << endl;
}
De sortie :
3
5
4
2
3
Chaque fois que je lance le programme, il affiche le même nombre à chaque fois. Est-il un moyen de contourner cela?
Vous devez vous connecter pour publier un commentaire.
La graine pour le générateur de nombre aléatoire n'est pas définie.
Si vous appelez
srand(time(NULL))
alors vous obtiendrez plus de résultats aléatoires:La raison en est que d'un nombre aléatoire généré à partir de la
rand()
fonction n'est pas réellement aléatoire. C'est tout simplement une transformation. Wikipédia donne une meilleure explication de la signification de nombre pseudo-aléatoire générateur: deterministic random bit generator. Chaque fois que vous appelezrand()
il prend de la graine et/ou le dernier nombre aléatoire(s) généré (la norme ne spécifie pas de l'algorithme utilisé, bien que C++11 dispose d'installations pour la spécification des algorithmes), exécute une opération mathématique sur ces chiffres, et retourne le résultat. Donc, si la semence de l'état est le même à chaque fois (comme c'est si vous n'appelez passrand
avec un vraiment de nombre aléatoire), puis vous obtiendrez toujours la même aléatoire de numéros.Si vous voulez en savoir plus, vous pouvez lire la suite de:
http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/
http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/
Si vous appelez
rand()
sans appelersrand()
, il agira comme si vous l'avez appelésrand(1)
implicitement. Le peu pertinents de la normeC99 7.20.2.2 The srand function
(sur lequelcstdlib
est basé) membres:En d'autres termes, vous sera obtenir chaque fois la même séquence. Vous pouvez modifier votre
main
dans:pour résoudre ce problème, en supposant que vous ne l'exécutez pas plus d'une fois par seconde.
Comme mentionné précédemment, vous aurez besoin de la
ctime
- tête pour cela. Vous devez également être en tirant danscstdlib
puisque c'est là querand
etsrand
vivre. Il est aussi généralement une bonne idée d'utiliser lecXXX
en-têtes plutôt que de laXXX.h
ceux (cmath
plutôt quemath.h
, par exemple).Donc, après avoir fait tous ces changements, et l'utilisation des espaces de noms explicites, que je préfère même si d'autres ne peuvent pas), je finirais avec:
qui donne un ordre différent à chaque fois que je le lance, pour quelques temps de toute façon. Évidemment, il y a une dure limite à laquelle les données de répétition (il y a seulement 45 possibilités) et le "hasard" de la nature de la sortie signifie qu'il peut répéter avant, alors que bien 🙂
C'est une fonctionnalité de la
rand()
fonction.Ce que vous avez n'est pas un générateur de nombre aléatoire, mais plus strictement une "Pseudo Random Number Generator". Être en mesure de reproduire les mêmes séquences aléatoires pour les mêmes graines (vous les semences à l'aide de la
srand(x)
fonction) peut être important de reproduire les bugs ou pour préserver l'état à travers le programme s'exécute.Personnellement, j'utilise cette fonction pour être en mesure de mettre en pause/persistent rendu-processus dans un monte-carlo en fonction du terrain rendu. Un effet secondaire de nice, c'est que vous êtes en mesure de garantir des différentes monte-carlo des expériences sur des machines différentes, et, par conséquent, être en mesure de générer de la garantie des résultats différents qui peut ensuite être réduit en une étape finale d'une qualité supérieure résultat final (bien sûr, vous pouvez les réutiliser ultérieurement cet accroissement de la qualité du résultat final à produire des résultats de qualité supérieure).
Noter, cependant, que ni C ni C++ définir le numéro de séquence de
rand()
. Donc, si vous avez besoin de la garantie des séquences sur les plates-formes, utilisez l'une de C++11 nouveaux générateurs de nombres aléatoires (par exemple, un mersenne twister), rouler (certains générateurs sont presque banale à saisir, cependant, parce que la plupart d'entre eux reposent sur des dépassement de comportement de leur mise en œuvre peut ne pas être trivial), ou de l'utilisation des composants tiers (par exemple, boost::random).Vous avez besoin de la graine du générateur de nombres aléatoires (voir la fonction 'srand'). En supposant que vous ne faites pas de la cryptographie, puis de l'ensemencer avec la sortie de "temps" est probablement assez bon.
Vous sont effectivement obtenir pseudo aléatoire de nombres. Pour les rendre "plus au hasard", vous pouvez la graine du générateur de nombres aléatoires à l'aide de quelque chose qui "change" (le plus souvent à l'heure actuelle).
utilisation randomize(). Automatiquement les graines de la valeur.
Ou si vous voulez utiliser rand() ensuite, vous pouvez semer en utilisant srand(seedvalue); la valeur de départ peut être n'importe quoi comme système de temps..que vais vous donner différents nombres aléatoires chaque fois que
randomize
n'est pas un standard C++ la fonction. La plate-forme parlez-vous?