Supposons que nous avons un générateur aléatoire qui délivre les numéros dans la gamme avec une distribution uniforme et nous devons générer des nombres aléatoires dans la gamme avec une distribution uniforme.[ 0 .. N - 1 ]
Supposons que et ne divise pas également ; afin d'obtenir une distribution vraiment uniforme, nous pouvons utiliser la méthode d' échantillonnage de rejet :N R
- si est le plus grand entier tel quek N < R
- choisir un nombre aléatoire dans[ 0 .. R - 1 ]
- si alors sortir r \ mod N , sinon continuer d'essayer avec d'autres nombres aléatoires r ', r ", ... jusqu'à ce que la condition soit remplie
L'échantillonnage par rejet est-il le seul moyen d'obtenir une distribution discrète vraiment uniforme?
Si la réponse est oui, pourquoi?
Remarque: si l'idée est la même: générer un nombre aléatoire dans , par exemple où est un nombre aléatoire dans la plage
Réponses:
Oui et non, selon ce que vous entendez par «la seule façon». Oui, dans la mesure où il n'y a pas de méthode garantie pour se terminer, le mieux que vous puissiez faire (pour les valeurs génériques de et ) est un algorithme qui se termine avec la probabilité 1. Non, en ce que vous pouvez réduire le «gaspillage» aussi petit comme vous voulez.RN R
Pourquoi la résiliation garantie est impossible en général
Supposons que vous ayez un moteur de calcul déterministe (une machine de Turing ou tout ce qui fait flotter votre bateau), plus un oracle qui génère des éléments aléatoires de l' ensemble d' éléments . Votre objectif est de générer un élément de l' ensemble d'éléments . La sortie de votre moteur ne dépend que de la séquence de valeurs renvoyées par l'oracle; c'est une fonction de cette séquence potentiellement infinie .[ 0 .. R - 1 ] N [ 0 , N - 1 ] f ( r 0 , r 1 , r 2 , … )R [0..R−1] N [0,N−1] f (r0,r1,r2,…)
Supposons que votre moteur appelle l'oracle au maximum fois. Il peut y avoir des traces pour lesquelles l'oracle est appelé moins de fois; si c'est le cas, appeler l'oracle extra times pour qu'il soit toujours appelé exactement fois ne change pas la sortie. Donc, sans perte de généralité, nous supposons que l'oracle est appelé exactement fois. Alors la probabilité du résultat est le nombre de séquences telles que . Puisque l'oracle est un générateur aléatoire uniforme, chaque séquence est équiprobable et a la probabilité . La probabilité de chaque résultat est donc de la formem m m x ( r 0 , … , r mm m m m x f( r 0 ,…, r m - 1 )=x1 / R m A / R m A0 R m(r0,…,rm−1) f(r0,…,rm−1)=x 1/Rm A/Rm où est un entier compris entre et .A 0 Rm
Si divise pour quelques , alors vous pouvez générer une distribution uniforme sur éléments en appelant le générateur aléatoire fois (cela est laissé au lecteur comme exercice). Dans le cas contraire, cela est impossible: il n'y a aucun moyen d'obtenir un résultat avec une probabilité . Notez que la condition équivaut à dire que tous les facteurs premiers de sont également des facteurs de (c'est plus permissif que ce que vous avez écrit dans votre question; par exemple, vous pouvez choisir un élément aléatoire parmi 4 avec une foire à 6 faces mourir, même si 4 ne divise pas 6).R m m N m 1 / N N RN Rm m N m 1/N N R
Réduire les déchets
Dans votre stratégie, lorsque , vous n'avez pas à redessiner immédiatement. Intuitivement, il reste un peu d'entropie dans que vous pouvez conserver dans le mix.[ kr≥kN [kN..R−1]
Supposons un instant que vous continuerez en fait à générer des nombres aléatoires en dessous de pour toujours, et que vous en générerez à la fois en faisant tirages. Si vous effectuez un échantillonnage de rejet simple sur cette génération groupée, le gaspillage sur attire est , c'est-à-dire le reste divisé par le nombre de tirages. Cela peut être aussi petit que . Lorsque et sont des coprimes, vous pouvez rendre les déchets arbitrairement petits en choisissant des valeurs suffisamment grandes de . Pour les valeurs générales de etu d d R d - kN u d d Rd−kNud RdmodNu R N d R N pgcd ( R , N ) N / pgcd ( R , N )gcd(R,N) R N d R N , le calcul est plus compliqué car vous devez prendre en compte la génération de et séparément, mais là encore, vous pouvez rendre les déchets arbitrairement petits avec des groupes suffisamment grands.gcd(R,N) N/gcd(R,N)
En pratique, même avec des nombres aléatoires relativement inefficaces (par exemple en cryptographie), il vaut rarement la peine de faire autre chose qu'un simple échantillonnage de rejet, sauf si est petit. Par exemple, en cryptographie, où est généralement une puissance de 2 et est généralement des centaines ou des milliers de bits, la génération uniforme de nombres aléatoires se déroule généralement par échantillonnage par rejet direct dans la plage souhaitée.R NN R N
la source
Le théorème de codage source de Shannon montre que, dans un sens exact, vous avez besoin d' échantillons (en moyenne) du type pour générer un nombre aléatoire du type . Plus précisément, Shannon donne un algorithme (inefficace) qui, pour échantillons du premier type, génère échantillons du deuxième type, avec une probabilité élevée. Il montre également que la sortie de échantillons avec une forte probabilité est impossible.[ 0 , … , R - 1 ] [ 0 , … , N - 1 ] m m ( log N / log R - ϵ ) m ( log N / log R + ϵ )logN/logR [0,…,R−1] [0,…,N−1] m m(logN/logR−ϵ) m(logN/logR+ϵ)
Le théorème de Shannon fonctionne également dans le cas plus général d'une distribution d'entrée asymétrique (et probablement aussi d'une distribution asymétrique de sortie). Dans ce cas, vous devez remplacer le logarithme par l'entropie. Alors que l'algorithme donné par le théorème est défini de manière aléatoire, dans certains cas, il est possible de le dérandomiser (au prix de performances un peu moins bonnes).
la source
En fait, non, l'échantillonnage par rejet est loin d'être la seule façon de procéder. Malheureusement, étant donné que les ordinateurs stockent toutes les informations sous forme de bits et ne peuvent donc manipuler que des bits d'information aléatoires, tout algorithme pour dessiner une variable aléatoire uniforme de la plage sera infini, si le développement de la base binaire de est infini.NN N
Ce théorème est un résultat classique de Knuth et Yao (1976), qui ont développé le cadre des DDG-arbres (distribution discrète générant des arbres).
Les méthodes exposées par Gilles sont le genre de chose typique qui a été fait pour atténuer les déchets occasionnés par le rejet, mais bien sûr, si l'on peut générer les arbres de Knuth et Yao suivants, c'est beaucoup, beaucoup plus efficace - en moyenne 96% des bits aléatoires sont enregistrés.
J'ai donné plus d'informations à ce sujet dans le post CStheory suivant .
la source