Au fond, ce n'est pas vraiment juste une question R; elle concerne plus généralement la génération de nombres aléatoires.
Les nombres "aléatoires" sont très importants dans de nombreuses parties des statistiques. Nous avons besoin des valeurs aléatoires que nous générons pour avoir certaines propriétés, et (généralement) beaucoup d'efforts sont consacrés à la construction de générateurs de nombres aléatoires et à la vérification de leurs propriétés.
L'idée est que nous voulons obtenir une séquence de valeurs qui sont un bon proxy pour des nombres réellement aléatoires. Le cheval de bataille habituel de la génération de nombres aléatoires est la distribution uniforme (à partir de laquelle nous en construisons d'autres, comme les nombres aléatoires gaussiens).
Donc (le plus généralement) un algorithme numérique est utilisé pour construire une séquence d'entiers, chacun en fonction d'une fonction des précédents. Ces entiers sont ensuite mis à l'échelle pour se situer entre 0 et 1 (généralement [ 0 , 1 ) ).
Par exemple, beaucoup travaillent simplement sur le précédent:
X1= f( x0)z1= x1/ mX2= f( x1)z2= x2/ mX3= f( x2)z3= x3/ m⋮
XzF
X0
X3
Voir ?runif
dans R et vous remarquerez qu'il explique l'existence de la graine aléatoire, avec un lien vers l'aide ?.Random.seed
qui explique le grand nombre de générateurs de nombres aléatoires disponibles dans R (vous pouvez même fournir les vôtres). La même page d'aide explique que si vous n'avez pas utilisé la génération de nombres aléatoires avant ou défini la graine, pour commencer la graine est prise de l'horloge, puis la valeur précédente est stockée (de sorte que le prochain nombre aléatoire que vous obtenez soit le même que vous auriez obtenu si vous aviez généré une valeur de plus la dernière fois - il se souvient "où vous en êtes").
La fonction runif
dans R (comme pas mal d'autres routines de génération de nombres aléatoires dans d'autres packages qui peuvent généralement faire quelque chose de similaire) connaît l'endroit où la graine de nombres aléatoires est conservée. Il continue de mettre à jour cette valeur au fur et à mesure. Il peut donc fonctionner sans avoir à passer explicitement une graine, mais il en utilise toujours une; si vous ne lui en avez pas donné, il utilise simplement celui qu'il a enregistré en dernier.
Quant à savoir pourquoi il donne des sorties différentes à chaque fois (si vous ne lui dites pas de donner la même séquence): il le fait parce que les mêmes valeurs à chaque fois seraient généralement très contre-productives - il n'aurait pas les propriétés qui se répètent l'échantillonnage aléatoire aurait, ce qui le rend peu utile pour les putpos pour lesquels nous utilisons des générateurs de nombres aléatoires.