Pourquoi runif ne génère-t-il pas toujours le même résultat?


11

Pourquoi les générateurs de nombres aléatoires comme runif()dans R ne génèrent-ils pas le même résultat à chaque fois?

Par exemple:

X <- runif(100)
X

génère des sorties différentes à chaque fois.

Quelle est la raison de générer des sorties différentes à chaque fois?

De quelles fonctionnalités dispose-t-il en arrière-plan pour ce faire?


3
Une façon d'y penser est de vous demander: "voudriez-vous que votre générateur de nombres aléatoires génère les mêmes nombres à chaque fois?"
shadowtalker

2
@ssdecontrol: Voir Dilbert
Henry

2
Ou xkcd
Henry

Réponses:


18

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 ?runifdans R et vous remarquerez qu'il explique l'existence de la graine aléatoire, avec un lien vers l'aide ?.Random.seedqui 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 runifdans 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.


14

Vous devez définir la graine aléatoire afin d'obtenir le même résultat à chaque fois. Utilisez ? Set.seed pour ce faire. Considérer:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

Vous pourriez être intéressé par la lecture de ceci: Raisons d'utiliser la fonction set.seed .


3
Bien que cela explique la mécanique de reproduction d'un ensemble de résultats, cela ne semble pas répondre à la question elle-même, qui se demande pourquoi ce type de comportement n'est pas automatique.
whuber

@whuber, je pense que la question n'est pas à distance ici. J'ai voté pour fermer instantanément et je l'aurais complètement fermé si j'avais eu ce privilège. J'ai posté ceci pour que le PO ne soit pas les mains vides.
gung - Rétablir Monica

exécutez "set.seed (1)" à chaque fois.
Nip
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.