¿Cuál es la forma más eficaz de simular un dado de 7 caras con un dado de 6 caras? He pensado un poco en ello pero no estoy seguro de llegar a algún sitio en concreto.
Para crear un dado de 7 caras podemos utilizar una técnica de rechazo. Los 3 bits dan un uniforme 1-8 y nosotros necesitamos un uniforme 1-7, lo que significa que tenemos que rechazar 1/8, es decir, un 12,5% de probabilidad de rechazo.
Para crear $n * 7$ -sus tiradas de dados son necesarias $\lceil log_2( 7^n ) \rceil$ bits. Esto significa que nuestra probabilidad de rechazo es $p_r(n)=1-\frac{7^n}{2^{\lceil log_2( 7^n ) \rceil}}$ .
Resulta que la probabilidad de rechazo varía mucho pero para $n=26$ obtenemos $p_r(26) = 1 - \frac{7^{26}}{2^{\lceil log_2(7^{26}) \rceil}} = 1-\frac{7^{26}}{2^{73}} \approx 0.6\%$ probabilidad de rechazo que es bastante buena. Esto significa que podemos generar con buenas probabilidades 26 tiradas de 7 dados de 73 bits.
Del mismo modo, si lanzamos un dado justo $n$ veces obtenemos el número de $0...(6^n-1)$ que nos da $\lfloor log_2(6^{n}) \rfloor$ bits rechazando todo lo que está por encima $2^{\lfloor log_2(6^{n}) \rfloor}$ . En consecuencia, la probabilidad de rechazo es $p_r(n)=1-\frac{2^{\lfloor log_2( 6^{n} ) \rfloor}}{6^n}$ .
De nuevo, esto varía mucho, pero para $n = 53$ obtenemos $p_r(53) = 1-\frac{2^{137}}{6^{53}} \approx 0.2\%$ que es excelente. Como resultado, podemos lanzar el dado de 6 caras 53 veces y obtener ~137 bits.
Esto significa que obtenemos alrededor de $\frac{137}{53} * \frac{26}{73} = 0.9207$ El dado de 7 caras sale de las tiradas de 6 caras, lo que se aproxima al óptimo $\frac{log 7}{log6} = 0.9208$ .
¿Hay alguna manera de conseguir lo óptimo? ¿Existe una manera de encontrar esos $n$ números como los anteriores que minimizan los errores? ¿Hay alguna teoría relevante a la que pueda echar un vistazo?
P.D. Expresiones relevantes de python:
min([ (i, round(1000*(1-( 7**i ) / (2**ceil(log(7**i,2)))) )/10) for i in xrange(1,100)], key=lambda x: x[1])
min([ (i, round(1000*(1- ((2**floor(log(6**i,2))) / ( 6**i )) ) )/10) for i in xrange(1,100)], key=lambda x: x[1])
P.S.2 Gracias a @Erick Wong por ayudarme a acertar la pregunta con sus estupendos comentarios.
Pregunta relacionada: ¿Existe una forma de simular cualquier $n$ -de la cara utilizando un conjunto fijo de tipos de troquel para todos $n$ ?