Génération manuelle de nombres aléatoires

30

Comment puis-je générer manuellement un nombre aléatoire à partir d'une distribution donnée, comme par exemple, 10 réalisations à partir de la distribution normale standard?

Dan ish
la source
10
Pouvez-vous expliquer pourquoi vous souhaitez procéder ainsi et quelles autres contraintes vous imposent?
mdewey
2
Vous pouvez obtenir un tableau de nombres aléatoires (rand utilisé pour les publier entre autres).
Batman
4
@Batman: oui en effet et le livre RAND de 10⁶ nombres aléatoires a reçu 655 commentaires sur Amazon. Tous prévisibles bien sûr.
Xi'an
10
(Je suis surpris que personne n'ait commenté cela plus tôt) À moins qu'il ne soit absolument essentiel de ne pas essayer d'utiliser des implémentations personnalisées pour générer des nombres aléatoires. Oui, c'est génial de savoir comment le faire et c'est probablement la première chose qu'on vous montrera dans une classe " méthodes MC " (et c'est génial!) Mais ne le faites pas dans des projets réels. Des routines spécialisées de génération de nombres aléatoires existent pour une raison, la mise en œuvre d'un algorithme de base à partir de zéro est une perte de temps, une source de bugs et un faible effort de sensibilisation au champ.
usεr11852 dit Réintégrer Monic
2
@ Xi'an: Oui, je suis d'accord que c'est une présomption sûre. Comme mentionné, ce n'est qu'un commentaire pour avertir les gens d'utiliser leur propre RNG sans se rendre compte que la conception du RNG est une affaire très sérieuse. Pour citer von Neumann : "Quiconque envisage des méthodes arithmétiques de production de chiffres aléatoires est, bien sûr, dans un état de péché."
usεr11852 dit Réintégrer Monic

Réponses:

46

Si «manuellement» inclut «mécanique», vous disposez de nombreuses options. Pour simuler une variable de Bernoulli avec la moitié de probabilité, nous pouvons lancer une pièce: pour les queues, 1 pour les têtes. Pour simuler une distribution géométrique, nous pouvons compter le nombre de lancers de pièces nécessaires avant d'obtenir des têtes. Pour simuler une distribution binomiale, nous pouvons lancer notre pièce n fois (ou simplement lancer n pièces) et compter les têtes. La «quinconce» ou la «machine à grains» ou la «boîte de Galton» est une alternative plus cinétique - pourquoi ne pas en mettre une en action et voir par vous - même ? Il semble qu'il n'y ait pas de "pièce pondérée"01nnmais si l'on souhaite faire varier le paramètre de probabilité de notre variable de Bernoulli ou binomiale à des valeurs autres que , l'aiguille de Georges-Louis Leclerc, le comte de Buffon nous le permettra. Pour simuler la distribution uniforme discrète sur { 1 , 2 , 3 , 4 , 5 , 6 }, nous lançons un dé à six faces. Les fans de jeux de rôle auront rencontré des dés plus exotiques , par exemple des dés tétraédriques à échantillonner uniformément parmi { 1 , 2 , 3 , 4 }p=0,5{1,2,3,4,5,6}{1,2,3,4}, tandis qu'avec une roulette ou une roulette, on peut aller encore plus loin. ( Crédit d'image )

Variété de dés

Devrions-nous être fous de générer des nombres aléatoires de cette manière aujourd'hui, alors qu'il n'y a qu'une commande sur une console d'ordinateur - ou, si nous avons une table appropriée de nombres aléatoires disponibles, une incursion dans les coins les plus poussiéreux de la bibliothèque? Eh bien peut-être, bien qu'il y ait quelque chose d'agréablement tactile dans une expérience physique. Mais pour les personnes travaillant avant l'ère de l'informatique, en fait avant les tables de nombres aléatoires à grande échelle largement disponibles (dont plus tard), la simulation manuelle de variables aléatoires avait une importance plus pratique. Quand Buffon a enquêté sur le paradoxe de Saint-Pétersbourg- le célèbre jeu de lancer de pièces où le montant que le joueur gagne double chaque fois qu'une tête est lancée, le joueur perd sur les premières queues, et dont le gain attendu est contre-intuitivement infini - il avait besoin de simuler la distribution géométrique avec . Pour ce faire, il semble qu'il ait engagé un enfant pour lancer une pièce de monnaie pour simuler 2048 parties du jeu de Saint-Pétersbourg, enregistrant le nombre de lancers avant la fin du jeu. Cette distribution géométrique simulée est reproduite dans Stigler (1991) :p=0,5

Tosses Frequency
1      1061
2      494
3      232
4      137
5      56
6      29
7      25
8      8
9      6

Dans le même essai où il a publié cette enquête empirique sur le paradoxe de Saint-Pétersbourg, Buffon a également présenté la fameuse " aiguille de Buffon ". Si un avion est divisé en bandes par des lignes parallèles distantes d'une distance , et qu'une aiguille de longueur l d y tombe, la probabilité que l'aiguille croise l'une des lignes est de 2 ll .2lπ

L'expérience de l'aiguille de Buffon

L'aiguille de Buffon peut donc être utilisée pour simuler une variable aléatoire ouXBinôme(n,2lXBernoulli(2lπ), et nous pouvons ajuster la probabilité de réussite en modifiant la longueur de nos aiguilles ou (peut-être plus commodément) la distance à laquelle nous gouvernons les lignes. Une autre utilisation des aiguilles de Buffon est une manière terriblement inefficace de trouver une approximation probabiliste pourπ. L'image (crédit) montre 17 allumettes, dont 11 traversent une ligne. Lorsque la distance entre les lignes réglées est définie égale à la longueur de l'allumette, comme ici, la proportion attendue des allumettes croisées est de2XBinomial(n,2lπ)π et donc on peut estimer π comme l'inverse de la fraction observée deux fois: ici on obtient π =2172ππ^. En 1901Mario Lazzarini prétendu avoir effectué l'expérienceutilisantaiguilles2,5 cm aveclignes espacées3 cm, et après 3408 lancers obtenus π =355π^=217113.1 . Il s'agit d'un rationnel bien connu deπ, précis à six décimales près. Badger (1994) fournit des preuves convaincantes que cela était frauduleux, notamment pour être sûr à 95% de la précision de six décimales en utilisant l'appareil de Lazzarini, il faut jeter 134 trillions d'aiguilles qui sapent la patience! Il est certain que l'aiguille de Buffon est plus utile comme générateur de nombres aléatoires que comme méthode d'estimation deπ.π^=355113ππ


Jusqu'à présent, nos générateurs ont été discrètement décevants. Et si nous voulons simuler une distribution normale? Une option consiste à obtenir des chiffres aléatoires et à les utiliser pour former de bonnes approximations discrètes à une distribution uniforme sur , puis à effectuer des calculs pour les transformer en écarts normaux aléatoires. Une roulette ou une roulette peut donner des chiffres décimaux de zéro à neuf; un dé peut générer des chiffres binaires; si nos compétences arithmétiques peuvent faire face à une base plus funky, même un ensemble de dés standard ferait l'affaire. D'autres réponses ont couvert ce type d'approche basée sur la transformation plus en détail; Je remets toute discussion à ce sujet jusqu'à la fin.[0,1]

À la fin du XIXe siècle, l'utilité de la distribution normale était bien connue, et il y avait donc des statisticiens désireux de simuler des écarts normaux aléatoires. Inutile de dire que de longs calculs manuels n'auraient été appropriés que pour mettre en place le processus de simulation en premier lieu. Une fois cela établi, la génération des nombres aléatoires devait être relativement rapide et facile. Stigler (1991) énumère les méthodes employées par trois statisticiens de cette époque. Tous recherchaient des techniques de lissage: les écarts normaux aléatoires présentaient un intérêt évident, par exemple pour simuler une erreur de mesure qui devait être lissée.

Le remarquable statisticien américain Erastus Lyman De Forest était intéressé par le lissage des tables de mortalité et a rencontré un problème qui nécessitait la simulation des valeurs absolues des écarts normaux. Dans ce qui deviendra un thème courant, De Forest échantillonnait vraiment à partir d'une distribution semi-normale . De plus, plutôt que d'utiliser un écart type de un (le nous avons l'habitude d'appeler "standard"), De Forest voulait une "erreur probable" (écart médian) de un. C'était la forme donnée dans le tableau de "Probabilité d'erreurs" dans les annexes de "Un manuel d'astronomie sphérique et pratique, Volume II" parZN(0,12)William Chauvenet . De ce tableau, De Forest a interpolé les quantiles d'une distribution semi-normale, de à p = 0,995 , qu'il considérait comme des "erreurs d'égale fréquence".p=0,005p=0,995

Tableau des erreurs de fréquence égale De Forest

Si vous souhaitez simuler la distribution normale, à la suite de De Forest, vous pouvez imprimer ce tableau et le découper. De Forest (1876) a écrit que les erreurs "ont été inscrites sur 100 morceaux de carton de taille égale, qui ont été secoués dans une boîte et tous dessinés un par un".

L'astronome et météorologue Sir George Howard Darwin (fils du naturaliste Charles) a donné une tournure différente aux choses, en développant ce qu'il a appelé une "roulette" pour générer des écarts normaux aléatoires. Darwin (1877) décrit comment:

Un morceau de carte circulaire a été gradué radialement, de sorte qu'une graduation marquée était de 720Xdegrés éloignés d'un rayon fixe. La carte a été faite pour tourner autour de son centre près d'un index fixe. Il a ensuite été tourné un certain nombre de fois, et à l'arrêt, le nombre opposé à l'index a été lu. [Darwin ajoute dans une note de bas de page: Il vaut mieux arrêter le disque quand il tourne si vite que les graduations sont invisibles, plutôt que de le laisser suivre son cours.] D'après la nature de la graduation, les nombres ainsi obtenus se produiront exactement de la même manière que les erreurs d'observation se produisent dans la pratique; mais ils n'ont aucun signe d'addition ou de soustraction préfixé. Puis en lançant une pièce encore et encore et en appelant les têtes+et les queues-, les signes720π0Xe-X2X+- ou - sont attribués par hasard à cette série d'erreurs.+-

"Index" doit être lu ici comme "pointeur" ou "indicateur" (cf. "index"). Stigler souligne que Darwin, comme De Forest, utilisait une distribution cumulative semi-normale autour du disque. Par la suite, l'utilisation d'une pièce de monnaie pour attacher un signe au hasard en fait une distribution normale complète. Stigler note qu'il n'est pas clair comment finement l'échelle a été graduée, mais suppose que l'instruction d'arrêter manuellement le disque à mi-rotation était "de diminuer le biais potentiel vers une section du disque et d'accélérer la procédure".

Sir Francis Galton , d'ailleurs un demi-cousin de Charles Darwin, a déjà été mentionné à propos de son quinconce. Bien que cela simule mécaniquement une distribution binomiale qui, par le théorème de De Moivre – Laplace présente une ressemblance frappante avec la distribution normale (et est parfois utilisée comme aide pédagogique pour ce sujet), Galton a en fait produit un schéma beaucoup plus élaboré quand il a souhaité échantillon d'une distribution normale. Encore plus extraordinaire que les exemples non conventionnels en haut de cette réponse, Galton a développé des dés distribués normalement- ou plus précisément, un ensemble de dés qui produisent une excellente approximation discrète d'une distribution normale avec une déviation médiane. Ces dés, datant de 1890, sont conservés dans la collection Galton de l'University College London.

Dés normaux de Galton

Dans un article de Nature en 1890, Galton écrivait:

En tant qu'instrument de sélection au hasard, je n'ai rien trouvé de mieux que les dés. Il est très fastidieux de bien mélanger les cartes entre chaque tirage successif, et la méthode de mélange et d'agitation des boules marquées dans un sac est encore plus fastidieuse. Un teetotum ou une forme de roulette est préférable à ceux-ci, mais les dés sont meilleurs que tous. Lorsqu'ils sont secoués et jetés dans un panier, ils se précipitent si divers les uns contre les autres et contre les nervures de la vannerie qu'ils dégringolent énormément, et leurs positions au début ne fournissent aucun indice perceptible de ce qu'ils seront après même un bien secouer et mélanger. Les chances offertes par un dé sont plus variées qu'on ne le pense généralement; il y a 24 possibilités égales, et pas seulement 6, parce que chaque face a quatre bords qui peuvent être utilisés, comme je vais le montrer.

+-114

Conception de dés normaux Galton

Le laboratoire de Raazesh Sainudiin pour les expériences statistiques mathématiques comprend un projet étudiant de l'Université de Canterbury, NZ, reproduisant les dés de Galton . Le projet comprend une enquête empirique consistant à lancer les dés plusieurs fois (y compris un CDF empirique qui semble rassurant "normal") et une adaptation des scores des dés afin qu'ils suivent la distribution normale standard. En utilisant les scores originaux de Galton, il existe également un graphique de la distribution normale discrétisée que les scores des dés suivent réellement.

Distribution discrète des dés de Galton


À grande échelle, si vous êtes prêt à étendre le "mécanique" à l'électrique, notez que l'épopée A Million Random Digits de RAND avec 100 000 déviations normales était basée sur une sorte de simulation électronique d'une roue de roulette. Du rapport technique (par George W. Brown, à l'origine juin 1949) nous trouvons:

Ainsi motivés, les gens de RAND, avec l'aide du personnel technique de Douglas Aircraft Company, ont conçu une roulette électro basée sur une variation d'une proposition faite par Cecil Hastings. Aux fins de cet exposé, une brève description suffira. Une source d'impulsions de fréquence aléatoire a été déclenchée par une impulsion de fréquence constante, environ une fois par seconde, fournissant en moyenne environ 100 000 impulsions en une seconde. Les circuits de normalisation des impulsions transmettaient les impulsions à un compteur binaire à cinq places, de sorte qu'en principe, la machine était comme une roue de roulette à 32 positions, effectuant en moyenne environ 3000 tours à chaque tour. Une conversion binaire en décimale a été utilisée, jetant 12 des 32 positions, et le chiffre aléatoire résultant a été introduit dans un poinçon IBM, produisant des tableaux de cartes perforées de chiffres aléatoires.

χ2des tests des fréquences des chiffres pairs et impairs ont révélé que certains lots présentaient un léger déséquilibre. Cela était pire dans certains lots que dans d'autres, ce qui suggère que "la machine était en panne depuis le mois de sa mise au point ... Les indications indiquent que cette machine a nécessité un entretien excessif pour la maintenir en parfait état". Cependant, un moyen statistique de résoudre ces problèmes a été trouvé:

À ce stade, nous avions nos millions de chiffres d'origine, 20 000 cartes IBM avec 50 chiffres sur une carte, avec le biais impair mais pair perceptible révélé par l'analyse statistique. Il a maintenant été décidé de retradomiser la table, ou du moins de la modifier, en jouant avec une petite roulette, pour supprimer le biais impair-pair. Nous avons ajouté (mod 10) les chiffres de chaque carte, chiffre par chiffre, aux chiffres correspondants de la carte précédente. Le tableau dérivé d'un million de chiffres a ensuite été soumis aux différents tests standard, tests de fréquence, tests en série, tests de poker, etc.

Il y avait, bien sûr, de bonnes raisons de croire que le processus d'ajout ferait du bien. De manière générale, le mécanisme sous-jacent est l'approche limitante des sommes de variables aléatoires modulo l'intervalle unitaire dans la distribution rectangulaire, de la même manière que les sommes non restreintes de variables aléatoires approchent la normalité. Cette méthode a été utilisée par Horton et Smith, de l'Interstate Commerce Commission, pour obtenir de bons lots de nombres apparemment aléatoires à partir de lots plus importants de nombres mal non aléatoires.

[0,1]u[0,1]FF-1(u)

Ziggourat pour semi-normal

Les références


()"Quiconque considère les méthodes arithmétiques de production de chiffres aléatoires est, bien sûr, dans un état de péché. , et une procédure arithmétique stricte n'est bien sûr pas une telle méthode. "

Silverfish
la source
5
Vous plaisantez ... (mais, oui, c'est vraiment manuellement +1)
nalzok
8
Combien de travail y a été consacré!
Richard Hardy
3
Notez que les dés non standard peuvent être injustes, il est donc bon de les tester d'abord, par exemple youtube.com/watch?v=VI3N4Qg-JZM
Tim
2
@RichardHardy Paradoxalement, il est en fait plus facile pour moi d'écrire toutes ces choses pendant qu'elles sont devant moi, et au moins temporairement stockées dans ma mémoire, que d'essayer de les transporter partout dans ma tête!
Silverfish
2
En tout cas, je trouve ça impressionnant!
Richard Hardy
44

X=-2bûcheU1cos(2πU2)
Oui=-2bûcheU1péché(2πU2)X

Par exemple, sur mon système d'exploitation Linux, je peux vérifier

$ date +%s.%N
1479733744.077762986
$ date +%s.%N
1479733980.615056616

U1=.077762986, U2=.615056616
X
> sqrt(-2*log(.077762986))*cos(2*pi*.615056616)
[1] -1.694815

Addendum: étant donné que le calcul des logarithmes et des cosinus peut ne pas être considéré comme suffisamment manuel , il existe une variante de Box-Müller qui évite d'utiliser ces fonctions transcendantales (voir exercice 2.9 dans notre livre Monte Carlo Statistical Methods ):

une variante de Box-Muller

Maintenant, on peut argumenter contre cette version en raison des variations exponentielles. Mais il existe également un moyen très intelligent de simuler ces variables sans appel à des fonctions transcendantales , en raison de von Neumann, comme résumé dans cet algorithme reproduit à partir des variantes aléatoires non uniformes de Luc Devroye :

entrez la description de l'image ici

Certes, il nécessite le calcul de 1 / e, mais une seule fois.

(0,1)2(0,1)(0,2π)

L'utilisation du CLT pour approximer la normalité n'est certainement pas une méthode que je conseillerais car (1) vous avez toujours besoin d'autres variables pour alimenter la moyenne, vous pouvez donc aussi utiliser des uniformes dans l'algorithme de Box-Müller, et (2) la précision augmente assez lentement avec le nombre de simulations. Surtout si vous utilisez une variable aléatoire discrète comme le résultat d'un dé, même avec plus de six faces . Pour citer Thomas et al. (2007), une enquête sur les avantages et les inconvénients des générateurs aléatoires gaussiens:

Le théorème de la limite centrale est bien sûr un exemple de méthode «approximative» - même si l'arithmétique parfaite est utilisée, pour K fini, la sortie ne sera pas gaussienne.

Voici une expérience rapide pour illustrer le problème: j'ai généré 100 fois la moyenne de 30 résultats de décès:

dies=apply(matrix(sample(1:6,30*100,rep=TRUE),ncol=30),1,mean)

puis normalisé ces moyennes en moyenne zéro - la variance un varie

stdies=(dies-3.5)/sqrt(35/12/30)

et a examiné l'ajustement normal [ou son absence] de cet échantillon:

qqnorm (stdies, col = "gold2", pch = 19); abline (a = 0, b = 1, col = "steelblue", lwd = 2, lty = 2)

dies76/30122/30je

U=je=1kje-16je
k=15
dies=matrix(apply(matrix(sample(0:5,15*200,rep=TRUE),nrow=15)/6^(1:15),2,sum),ncol=2) 
norma=sqrt(-2*log(dies[,1]))*c(cos(2*pi*dies[,2]),sin(2*pi*dies[,2]))

l'ajustement est aussi bon que prévu pour un échantillon normal de taille 200 (il suffit d'en tracer un autre pour un véritable échantillon normal norma=rnorm(100)):

entrez la description de l'image ici

comme le montre un test de Kolmogorov-Smirnov:

> ks.test(norma,pnorm)

        One-sample Kolmogorov-Smirnov test

data:  norma
D = 0.06439, p-value = 0.3783
alternative hypothesis: two-sided
Xi'an
la source
3

Ce n'est pas exactement aléatoire, mais il devrait être assez proche, car vous semblez vouloir une expérience approximative.

Utilisez votre téléphone pour configurer un chronomètre. Au bout de 10 bonnes secondes, arrêtez-le (plus vous attendez, plus vous vous approchez d'un résultat vraiment "aléatoire", mais 10 secondes suffisent). Prenez les derniers chiffres (par exemple, 10,67 secondes vous donnera 67). Appliquez le tableau des centiles pour la distribution normale. Dans cet exemple, il vous suffit de rechercher 0,67 et vous trouverez le numéro. Dans ce cas, votre valeur est d'environ 0,45. Ce n'est pas parfaitement précis, mais cela vous donnera une estimation solide.

Si vous roulez en dessous de 50, faites simplement 100- [Votre résultat] et utilisez le tableau. Votre résultat sera le même, avec un signe moins, en raison de la symétrie de N (0,1).

Thalantas
la source
3

n+1-1nnnN(0,1)


Pourquoi? Laisser

Xk: ={+1 si k-le coin flip est des têtes-1 si k-le coup de pioche est pile

P(Xk=±1)=12

E(Xk)=0Var(Xk)=1

Oui: =X1+X2++Xn

E(Oui)=0Var(Oui)=n

Normalisant,

Z: =Ouin

on obtient une variable aléatoire avec variance unitaire

E(Z)=0Var(Z)=1
Rodrigo de Azevedo
la source
1
Comme discuté dans ma réponse, je crains que le CLT ne soit pas une utilisation efficace du caractère aléatoire dans les lancers de pièces: ils seraient mieux exploités en tant que chiffres binaires d'une variation pseudo-aléatoire U (0,1) avec une précision simple ou double.
Xi'an
@ Xi'an J'ai lu votre réponse avant de poster la mienne, et votre objection au CLT semblait être basée sur une convergence lente. Puisqu'il s'agit d'une expérience de pensée, lancer une pièce 10 milliards de fois ne coûte rien. Et c'est vraiment une procédure manuelle qui ne nécessite aucun ordinateur, aucun calcul de logarithmes, de racines carrées ou de cosinus. Bien sûr, on pourrait utiliser une règle à calcul, mais cela peut aller trop loin.
Rodrigo de Azevedo
1
:}}: 10 milliards de tours de pièces ne me semblent pas très manuels ...!
Xi'an
Manuel = à la main. Le calcul manuel des logarithmes et des cosinus prend également du temps.
Rodrigo de Azevedo
0

Il convient de noter qu'une fois que vous pouvez générer un uniforme (0,1), vous pouvez générer n'importe quelle variable aléatoire pour laquelle l'inverse cdf est calculable en branchant simplement la variable aléatoire uniforme dans le CDF inverse.

Alors, comment peut-on calculer un uniforme (0,1) manuellement? Eh bien, comme mentionné par @Silverfish, il existe une variété de dés utilisés par les joueurs de RPG traditionnels. Dont l'un est un dé à dix faces. En supposant qu'il s'agit d'un dé juste, nous pouvons maintenant générer un uniforme discret (0, 9).

0,01,0,02,...,0,99,1,000,001,0,002,...,0,999,1.000

On peut donc s'approcher très près d'un uniforme continu (0,1) en l'approximant avec une distribution uniforme discrète finement quadrillée avec quelques dés à 10 faces. Cela peut ensuite être branché dans un CDF inverse pour produire la variable aléatoire d'intérêt.

Cliff AB
la source