El procedimiento para produce an unbiased coin from a biased one se atribuyó primero al Von Neumann (un tipo que ha hecho un trabajo enorme en matemáticas y en muchos campos relacionados). El procedimiento es super simple:
- lanzar la moneda dos veces.
- Si los resultados coinciden, vuelva a empezar, olvidando ambos resultados.
- Si los resultados difieren, use el primer resultado, olvidando el segundo.
La razón funciona este algoritmo se debe a que la probabilidad de obtener HT es p(1-p)
, lo que es lo mismo que recibir TH (1-p)p
. Por lo tanto, dos eventos son igualmente probables.
También estoy leyendo este libro y me pregunta el tiempo de ejecución esperado. La probabilidad de que dos lanzamientos no sean iguales es z = 2*p*(1-p)
, por lo tanto, el tiempo de ejecución esperado es 1/z
.
El ejemplo anterior se ve animando (después de todo, si usted tiene una moneda sesgada con un sesgo de p=0.99
, tendrá que tirar la moneda de aproximadamente 50 veces, lo que no es que muchos). Entonces, podrías pensar que este es un algoritmo óptimo. Lamentablemente no lo es.
Así es como se compara con Shannon's theoretical bound (la imagen está tomada de este answer). Muestra que el algoritmo es bueno, pero dista de ser óptimo.
uno se puede topar con una mejora si se quiere considerar que HHTT será desechado por este algoritmo, pero en realidad tiene la misma probabilidad que TTHH. Entonces también puede detenerse aquí y regresar H. Lo mismo sucede con HHHHTTTT y demás. El uso de estos casos mejora el tiempo de ejecución esperado, pero no lo hace teóricamente óptimo.
Y al final - código Python:
import random
def biased(p):
# create a biased coin
return 1 if random.random() < p else 0
def unbiased_from_biased(p):
n1, n2 = biased(p), biased(p)
while n1 == n2:
n1, n2 = biased(p), biased(p)
return n1
p = random.random()
print p
tosses = [unbiased_from_biased(p) for i in xrange(1000)]
n_1 = sum(tosses)
n_2 = len(tosses) - n_1
print n_1, n_2
es bastante explica por sí mismo, y aquí es un resultado ejemplo:
0.0973181652114
505 495
Como se ve, sin embargo, tuvimos un sesgo de 0.097
, tenemos aproximadamente el mismo número de 1
y 0
Supongo que la respuesta tiene que ver con usar el generador sesgado una vez de manera estándar y una vez como una función inversa para que tenga una probabilidad de probabilidad de 0 una vez y una (1-p) de 0 la segunda iteración y mezcla los dos resultados para equilibrar la distribución. Sin embargo, no sé la matemática exacta detrás de esto. –
Eric- sí, si lo hizo (rand() + (1-rand()))/2, podría razonablemente esperar obtener un resultado imparcial. Tenga en cuenta que en el punto anterior debe llamar a rand() dos veces; de lo contrario, siempre obtendrá.5 – JohnE
@JohnE: Esencialmente, eso es lo que estaba pensando, pero eso no te deja con un 0 o 1 directo, que se solicita. Creo que pau dio en el clavo con su respuesta. –