Generando uniformes discretos a partir de lanzamientos de monedas

9

Supongamos que tiene una moneda justa que puede lanzar tantas veces como desee (posiblemente infinitamente contable). ¿Es posible generar la distribución uniforme discreta en , donde(1,2,...,k)k NO es una potencia de 2? ¿Como lo harias?

Si esto es demasiado general, responder k=3 probablemente sería lo suficientemente interesante.

Renrenthehamster
fuente
¡Por supuesto! Y elk=3El caso es realmente instructivo. Piense en lanzar las monedas en pares (repetidamente, según sea necesario). ¿Cuáles son los posibles resultados? Ahora, ¿puedes mapear los resultados de los resultados de este procedimiento para obtener la distribución deseada?
cardenal
Correcto. Eso es bueno. Por ejemplo, HH = 1, HT = 2, TH = 3 y TT = voltear los pares. Hohoho, ahora estoy pensando en la entropía de los lanzamientos de monedas y cómo se puede maximizar la información de los lanzamientos (: ¡Pero lo haré yo mismo!
renrenthehamster
Aquí hay un gran artículo con código psuedo para exactamente lo que desea hacer: arxiv.org/pdf/1304.1916v1.pdf
1
@renrenthehamster: Sí, es O(Iniciar sesión2k) porque si definimos "éxito" como obtener un resultado válido de Iniciar sesión2k voltea, entonces la probabilidad de éxito es siempre 1/ /2. Entonces, el número de tales ensayos es geométrico con una media menor o igual a 2. Además, la probabilidad de necesitar más demetrotales ensayos disminuyen exponencialmente.
cardenal
1
@ren: considere formular una respuesta basada en su descubrimiento. Yo, por mi parte, estaré feliz de votar. Salud. :-)
cardenal

Respuestas:

5

Como dije anteriormente en mis comentarios, el documento http://arxiv.org/pdf/1304.1916v1.pdf , detalla exactamente cómo generar a partir de la distribución uniforme discreta de los lanzamientos de monedas y proporciona una sección muy detallada de pruebas y resultados de por qué El método funciona.

Como prueba de concepto, codifiqué su pseudocódigo Rpara mostrar cuán rápido, simple y eficiente es su método.

#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)")

ingrese la descripción de la imagen aquí


fuente