srand (time (0)) et génération de nombres aléatoires
srand(time(0))
est utilisé en C++ à l'aide à la génération de nombres aléatoires par semis rand, avec une valeur de départ.
Mais, pouvez-vous expliquer ce que cela signifie exactement?
Grâce.
source d'informationauteur Simplicity
Vous devez vous connecter pour publier un commentaire.
srand()
donne à la fonction aléatoire, un nouveau lot de semences, un point de départ (généralement des nombres aléatoires sont calculées en prenant le nombre précédent (ou de la graine), puis effectuez de nombreuses opérations sur le nombre pour générer le prochain).time(0)
donne le temps en secondes depuis l'époque Unix, qui est un très bon "imprévisible" de la graine (vous avez la garantie de votre postérité sera le même qu'une seule fois, sauf si vous démarrez votre programme plusieurs fois dans la même seconde).De ce que je me souviens, il y a une équation qui est utilisé pour générer une séquence de valeurs. La valeur suivante est quelque peu influencé par la valeur précédente. En utilisant le temps, vous définissez la valeur initiale de l'équation. Gardez à l'esprit, les valeurs sont pseudo-aléatoires.
Ainsi, par exemple, si vous faites quelque chose comme cela:
La même séquence de nombres sera généré. Toutefois, si vous n':
Deux différentes séquences de numéros de b e a généré en raison de la valeur de départ est différent.
Le C
rand
fonction génère des nombres aléatoires à l'aide d'une graine (comme la plupart -- tout? -- générateur pseudo-aléatoire).srand
est utilisé pour définir la graine à être utilisé par le générateur aléatoire de l'algorithme. La valeur retournée partime
(ie: la deuxième) est généralement passé à cette fonction, car c'est le plus simple à obtenir la valeur qui est généralement différent entre deux exécutions d'une applicationtout d'abord,
srand
&rand
est de/du C, pas du C++, C++0x est l'introduction de sa propre générateur de nombre aléatoire des classes.Autres que
srand
&rand
de mise en œuvre sont définis, ils ont seulement besoin de fournir un hasard entre 0 etRAND_MAX
. Sur windows sa base MWC16/32qui utilise le protocole TLS pour stocker les graines,srand
jeux de semences, qui est ensuite utilisé parrand
rouler un nombre pseudo-aléatoire.Par le biais de générateurs de nombres aléatoires son assez terrible, surtout la version de windows.
Il y a un l'article sur Wikipedia qui donne une bonne histoire et des exemples d'algorithmes utilisés.
La version courte est que
rand()
et ses semblables sont des générateurs de nombres pseudo-aléatoires. En fait, ils sont en fait déterministe—la séquence des numéros de produit est toujours le même. Cependant, la séquence est très très long, et le semis mécanisme fournit un moyen de départ à un (plus ou moins) arbitraire place dans cette séquence.En fonction de la façon dont les nombres aléatoires seront utilisés, il existe une variété de critères pour évaluer la qualité d'un générateur pseudo. Très simple circonstances, peut-être tout ce qui est nécessaire est une faible probabilité de la répétition des valeurs à partir d'appels consécutifs à
rand()
. Cependant, vous êtes susceptible de vouloir les chiffres pour se conformer à une distribution statistique. (Autant que je sache, la plupart des PRNGs produire uniformément distribué des nombres. Cependant diverses fonctions existent ou peuvent être facilement écrite de le transformer en une distribution gaussienne ou tout autre que vous pourriez avoir besoin).Enfin, lorsque la sécurité est une préoccupation pour vous, vous voulez un algorithme qui est, à toutes fins pratiques, imprévisible. Si un attaquant connaît précédemment généré nombre, elle ne devrait pas être en mesure de prévoir la prochaine. En très haute sécurité des applications, un véritable générateur de nombres aléatoires peuvent être utilisés, ceux-ci s'appuient sur plusieurs sources externes de hasard, tels que la radio statique, le bruit thermique dans un dispositif de saisie d'images (bouchon d'objectif), ou d'autres sources. Aussi, de nombreux systèmes d'exploitation modernes (y compris Linux) de recueillir et de stocker un "pool d'entropie" à partir de diverses sources telles que les imprévisible des interactions de l'utilisateur et de permettre la production de nombres aléatoires.
Une erreur de programmation courantes de personnes pas l'habitude de travailler avec des générateurs pseudo-aléatoires est de re-seed avant chaque appel à
rand()
. Bien sûr, c'est inutile et probablement pas souhaitable. Graines de chaque générateur qu'une seule fois.