Votre solution est correcte, si quelque peu inefficace et avec plus dupliqué logique. Voici un Python de mise en œuvre de la même algorithme dans un nettoyant forme.
def g ():
while True:
a = f()
if a != f():
return a
Si f() est cher vous souhaitez obtenir plus sophistiqués, avec l'aide de la match/mismatch informations pour essayer de revenir avec le moins d'appels à elle. C'est là la plus efficace possible solution.
def g ():
lower = 0.0
upper = 1.0
while True:
if 0.5 < lower:
return 1
elif upper < 0.5:
return 0
else:
middle = 0.25 * lower + 0.75 * upper
if 0 == f():
lower = middle
else:
upper = middle
Cela prend environ 2,6 appels d' g()
en moyenne.
La façon dont cela fonctionne est ce. Nous essayons de choisir un nombre aléatoire de 0 à 1, mais il nous arrive d'arrêter dès que nous saurons si le nombre est 0 ou 1. Nous commençons à savoir que le nombre est dans l'intervalle (0, 1). 3/4 des nombres sont dans le bas de 3/4 de l'intervalle, et 1/4 sont dans le top 1/4 de l'intervalle. Nous décidons de qui repose sur un appel à l' f(x)
. Cela signifie que nous sommes maintenant dans un petit intervalle.
Si nous laver, rincer et répéter un nombre de fois suffisant, nous pouvons déterminer notre nombre fini aussi précisément que possible, et ils ont absolument la même probabilité de liquidation dans n'importe quelle région de l'original de l'intervalle. En particulier, nous avons une même probabilité de liquidation plus grand que ou à moins de 0.5.
Si vous vouliez vous pourriez répéter l'idée de générer un flux continu de bits un par un. C'est, en effet, sensiblement le moyen le plus efficace de générer un tel flux, et est la source de l'idée de l'entropie dans la théorie de l'information.