L'échantillonnage par rejet est-il le seul moyen d'obtenir une distribution vraiment uniforme des nombres aléatoires?

21

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 ][0..R1][0..N1]

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 RN<RNR

  • si est le plus grand entier tel quek N < RkkN<R
  • choisir un nombre aléatoire dans[ 0 .. R - 1 ]r[0..R1]
  • si alors sortir r \ mod N , sinon continuer d'essayer avec d'autres nombres aléatoires r ', r ", ... jusqu'à ce que la condition soit remplier<kNrmodN
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 N>R l'idée est la même: générer un nombre aléatoire r dans [0..Rm1],Rm>=N , par exemple r=R(...R(Rr1+r2)...)+rmri est un nombre aléatoire dans la plage [0..R1]

Vor
la source

Réponses:

13

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.RNR

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..R1]N[0,N1]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 mmmmmxf( r 0 ,, r m - 1 )=x1 / R m A / R m A0 R m(r0,,rm1)f(r0,,rm1)=x1/RmA/Rmoù est un entier compris entre et .A0Rm

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 RNRmmNm1/NNR

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.[ krkN[kN..R1]

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 - kNuddRdkNudRdmodNuR N d R N pgcd ( R , N ) N / pgcd ( R , N )gcd(R,N)RNdRN, 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 NNRN

Gilles 'SO- arrête d'être méchant'
la source
La première preuve est imparfaite: l'existence de est trop forte. Nous pouvons avoir une machine qui consomme arbitrairement de nombreux éléments, mais qui s'arrête toujours . Fondamentalement, nous voulons exclure une séquence (celle qui ne se termine jamais) mais vous en excluez presque toutes un nombre fini. m
Raphael
@Raphael Je ne suis pas sûr de comprendre ce que tu veux dire. Pouvez-vous donner un exemple d'une telle machine?
Gilles 'SO- arrête d'être méchant'
Ah, ma préoccupation était trop générale. Ici - compte tenu de l'absence d'entrée - vous avez raison. Si tous les calculs se terminent, il y en a un nombre fini (pas d'entrée, nombre fini de décisions par étape, ergo un arbre fini), donc il y en a un plus long qui vous donne . m
Raphael
@Raphael Votre commentaire me fait penser à une meilleure présentation pour un public TCS: faire du RNG l'entrée d'un TM au lieu d'un oracle. Nous supposons que la TM se termine (sinon l'algorithme est incorrect). S'il existe un tel que, quelle que soit l'entrée, la MT examine la plupart des cellules d'entrée, alors <bla bla divisible par bla ne peut pas avoir résultats équiprobables>. Sinon, pour tout , la probabilité d'exiger au moins tirages est au moins . m R m N m m R - mmmRmNmmRm
Gilles 'SO- arrête d'être méchant'
1
@Raphael: Le lemme de König montre que si la machine s'arrête toujours, alors il y a en fait une limite supérieure sur son temps de fonctionnement. Cela fonctionne tant que l'ensemble de sortie du RNG est fini (et sinon, il est trivialement faux).
Yuval Filmus
6

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,,R1][0,,N1]mm(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).

Yuval Filmus
la source
5

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.NNN

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 .

Jérémie
la source