Génération d'uniforme discret à partir de flips de pièces

9

Supposons que vous ayez une pièce de monnaie équitable que vous pouvez lancer autant de fois que vous le souhaitez (éventuellement infiniment). Est-il possible de générer la distribution uniforme discrète sur(1,2,...,k), où kn'est pas une puissance de 2? Comment feriez-vous?

Si c'est trop général, répondre k=3 serait probablement assez intéressant.

renrenthehamster
la source
Sûr! Et lek=3le cas est réellement instructif. Pensez à retourner des pièces par paires (à plusieurs reprises, si nécessaire). Quels sont les résultats possibles? Maintenant, pouvez-vous cartographier les résultats des résultats de cette procédure de manière à obtenir la distribution souhaitée?
cardinal
Ah oui. C'est zonte. Par exemple, HH = 1, HT = 2, TH = 3 et TT = reflip les paires. Hohoho, maintenant je pense à l'entropie des jetons et comment maximiser les informations des tirages (: mais je le ferai moi-même!
renrenthehamster
Voici un excellent article avec le code psuedo pour exactement ce que vous voulez faire: arxiv.org/pdf/1304.1916v1.pdf
1
@renrenthehamster: Oui, c'est O(log2k) parce que, si nous définissons le «succès» comme l'obtention d'un résultat valide de la log2k flips, alors la probabilité de succès est toujours 1/2. Ainsi, le nombre de ces essais est géométrique avec une moyenne inférieure ou égale à 2. De plus, la probabilité d'avoir besoin de plus demces essais diminuent de façon exponentielle.
Cardinal
1
@ren: veuillez envisager de formuler une réponse en fonction de votre découverte. Pour ma part, je serai heureux de voter. À votre santé. :-)
Cardinal

Réponses:

5

Comme je l'ai dit ci-dessus dans mes commentaires, l'article http://arxiv.org/pdf/1304.1916v1.pdf , détaille exactement comment générer à partir de la distribution uniforme discrète à partir des tours de pièces et donne une section très détaillée des preuves et des résultats de la raison pour laquelle le fonctionne.

Comme preuve de concept, j'ai codé leur pseudo-code Rpour montrer à quel point leur méthode est rapide, simple et efficace.

#Function for sampling from a discrete uniform distribution
rdunif = function(n){

v = 1 
c = 0
a = 0
while(a > -1){
    v = 2*v
    c = 2*c + rbinom(1,1,.5) #This is the dice roll part

    if(v >= n){
        if(c < n){
            return(c)
        }else{
            v = v-n
            c = c-n
        }
    }
}
}

#Running the function k times for n = 11
n = 11
k = 10000
random.samples = rep(NA,k)

for(i in 1:k){
    random.samples[i] = rdunif(n)
}

counts = table(random.samples)
barplot(counts,main="Random Samples from a Discrete Uniform(0,10)")

entrez la description de l'image ici


la source