"Introducción al algoritmo" C.2-6
Describa un procedimiento que tome como entrada dos enteros a y b tales que $0 < a < b$ y, utilizando lanzamientos de moneda justos, produce como salida caras con probabilidad $a / b$ y las colas con probabilidad $(b - a) /b$ . Dar un límite en el número esperado de lanzamientos de monedas, que debería ser O(1) (Pista: Representar a/b en binario.)
Mi opinión es que podemos utilizar la cabeza para representar el bit 0 y la cola para el bit 1. Entonces, al voltear $m = \lceil \log_2 b \rceil$ veces, obtenemos un $m$ número basado en el binario de bits $x$ . Si $ x \ge b $ entonces dejamos caer x y volvemos a hacer el experimento, hasta que podamos un $ x < b$ . Esta x tiene una probabilidad $P\{ x < a\} = \frac a b$ y $P\{ a \le x < a\} = \frac {b - a} b$
Pero no estoy muy seguro de que mi solución sea la que pide la pregunta. ¿Estoy en lo cierto?
Editar,
Creo que Michael y TonyK dieron el algoritmo correcto, pero Michael explicó la razón detrás del algoritmo.
Las 3 preguntas que hizo:
- mostrar que este proceso requiere c lanzamientos de moneda, en la expectativa, para alguna constante c;
La expectativa de c, el número de tiradas, como señaló TonyK, es 2.
- muestran que usted grita "¡NO!" con una probabilidad de 2/3;
P(gritar "¡NO!") = P("la moneda sale cruz en un lanzamiento impar") = $ \sum_{k=1}^\infty (\frac 1 2)^ k = \frac 2 3$
- explique cómo generalizaría a otros números racionales, con la misma constante c
Es el algoritmo dado por TonyK. Podemos reformularlo así
Representar a/b en binario. Definir $f(Head) = 0$ y $f(Tail) = 1$ . Si
f(resultado del n-ésimo flip) = "n-ésimo bit de a/b"
y luego terminamos. Si la última tirada es Cabeza, gritamos "Sí", de lo contrario "No".
Tenemos $ P \{Yes\} = \sum_{i\in I}(1/2)^i = \frac a b $ donde I representa el conjunto de índices donde la expresión binaria de a/b es 1.