Es fácil generar una moneda justa usando una moneda injusta, pero lo contrario es más difícil de lograr.
Su programa recibirá un número X (entre 0 y 1, inclusive) como entrada. La entrada no debe estar simplemente codificada como un número en el medio del código fuente. Luego debe devolver un solo dígito: a 1
con una probabilidad de X y a lo 0
contrario.
Su programa solo puede usar una forma de generador de números aleatorios en el código fuente: int(rand(2))
(o un equivalente), que devuelve un cero o uno con la misma probabilidad. Puede incluir o acceder a esta función tantas veces como desee en su código. También debe proporcionar la función usted mismo como parte del código.
Su programa no puede usar ninguna otra función generadora de números aleatorios o fuentes externas (como las funciones de fecha y hora) que puedan funcionar como una función generadora de números aleatorios. Tampoco puede acceder a ningún archivo externo ni pasar el trabajo a programas externos.
Este es el código de golf, gana la respuesta más corta.
Respuestas:
Perl, 37
42charToma probabilidad arbitraria como argumento de línea de comando. Construye un número aleatorio uniforme
$d
y lo compara con la entrada.Anterior, solución de 52 char
fuente
Python, 81 caracteres
Puede estar apagado un poco, pero nunca más del 1%.
fuente
random.random() < desiredProbability
uso de este script: gist.github.com/3656877 Coincidenrandom.random() < x
es considerablemente más rápido.Mathematica 165
No simplificado, pero algunos pueden encontrar el algoritmo de interés:
Uso
Cheque
Veamos si
f[.53]
realmente produce el valor1
alrededor del 53% del tiempo. Cada prueba calcula el% para muestras de 10 ^ 4.50 de estas pruebas se ejecutan y promedian.
Histograma de resultados
Explicación (¡alerta de spoiler!)
La representación de base 2 de .53 es
Continuando de izquierda a derecha, un dígito a la vez:
Si RandomInteger [] devuelve 1, entonces respuesta = 1,
De lo contrario, si el segundo RandomInteger [] devuelve 0, entonces answer = 0,
De lo contrario, si el tercer RandomInteger [] devuelve 0, la respuesta = 0,
Más....
Si, cuando se han probado todos los dígitos, todavía no hay respuesta, entonces answer = RandomInteger [].
fuente
Haskell, 107 caracteres:
fuente
Wolfram Language (Mathematica) , 42 bytes
Pruébalo en línea!
Este es un enfoque recursivo. Ungolfed, el algoritmo es:
p
es inferior a 1/2, cuando el coinflip aparezca 0, devuelva 0. De lo contrario, vuelva a aparecer2p
; suponiendo que sea correcto, la probabilidad general de obtener 1 es la mitad de2p
op
.p
es mayor que 1/2, cuando el coinflip aparezca 1, regrese 1. De lo contrario, vuelva a comenzar2p-1
; asumiendo la corrección, la probabilidad general de obtener 0 es la mitad de1-(2p-1)
o1-p
.Para acortarlo, comenzamos con el monedero aleatorio, que, en cualquier rama, se devuelve la mitad del tiempo. Si el monedero no coincide con el caso cuando se supone que debemos devolverlo, reemplácelo por el resultado de recurrir en el
2p
módulo 1. (Es decir, cuandop
es menor que 1/2, reemplace 1; cuandop
es mayor que 1/2 , reemplace 0. Esto es equivalente a reemplazar⌈1-2p⌉
.)fuente