Il est facile de générer une pièce juste à l'aide d'une pièce injuste, mais l'inverse est plus difficile à réaliser.
Votre programme recevra un numéro X (entre 0 et 1, inclus) en entrée. L'entrée ne doit pas simplement être codée en dur sous forme de nombre au milieu du code source. Il doit alors renvoyer un seul chiffre: a 1
avec une probabilité de X et a 0
sinon.
Votre programme n'est autorisé à utiliser qu'une seule forme de générateur de nombres aléatoires dans le code source: int(rand(2))
(ou un équivalent), qui renvoie un zéro ou un avec une probabilité égale. Vous pouvez inclure ou accéder à cette fonction autant de fois que vous le souhaitez dans votre code. Vous devez également fournir la fonction vous-même dans le cadre du code.
Votre programme n'est pas autorisé à utiliser d'autres fonctions de génération de nombres aléatoires ou des sources externes (telles que les fonctions d'heure et de date) qui pourraient fonctionner comme une fonction de génération de nombres aléatoires. Il ne peut pas non plus accéder à des fichiers externes ni transmettre le travail à des programmes externes.
C'est le golf de code, la réponse la plus courte l'emporte.
Réponses:
Perl, 37
42car.Prend une probabilité arbitraire comme argument de ligne de commande. Construit un nombre aléatoire uniforme dans
$d
et le compare à l'entrée.Plus tôt, solution de 52 caractères
la source
Python, 81 caractères
Peut être légèrement décalé, mais jamais supérieur à 1%.
la source
random.random() < desiredProbability
aide de ce script: gist.github.com/3656877 Ils correspondent parfaitement i.imgur.com/Hr8uE.pngrandom.random() < x
est considérablement plus rapide.Mathematica 165
Pas rationalisé, mais certains peuvent trouver l'algorithme d'intérêt:
Usage
Vérifier
Voyons si
f[.53]
cela produit vraiment la valeur1
environ 53% du temps. Chaque test calcule le% pour des échantillons de 10 ^ 4.50 tests de ce type sont exécutés et moyennés.
Histogramme des résultats
Explication (alerte spoiler!)
La représentation en base 2 de 0,53 est
De gauche à droite, un chiffre à la fois:
Si RandomInteger [] renvoie 1, alors réponse = 1,
Sinon Si le deuxième RandomInteger [] renvoie 0, alors réponse = 0,
Sinon Si le troisième RandomInteger [] renvoie 0, la réponse = 0,
Autre....
Si, lorsque tous les chiffres ont été testés, il n'y a toujours pas de réponse, alors answer = RandomInteger [].
la source
Haskell, 107 caractères:
la source
Wolfram Language (Mathematica) , 42 octets
Essayez-le en ligne!
Il s'agit d'une approche récursive. Non golfé, l'algorithme est:
p
est inférieure à 1/2, alors lorsque le coinflip arrive à 0, retournez 0. Sinon, répétez2p
; en supposant l'exactitude, la probabilité globale d'obtenir 1 est la moitié de2p
oup
.p
est supérieure à 1/2, alors lorsque le coinflip arrive à 1, retournez 1. Sinon, répétez2p-1
; en supposant l'exactitude, la probabilité globale d'obtenir 0 est la moitié de1-(2p-1)
ou1-p
.Pour le raccourcir, nous commençons par le coinflip aléatoire, qui, dans l'une ou l'autre branche, est retourné la moitié du temps. Si le coinflip ne correspond pas au cas où nous sommes censés le retourner, remplacez-le par le résultat de la récurrence sur
2p
modulo 1. (C'est-à-dire, quandp
est inférieur à 1/2, remplacez 1; quandp
est supérieur à 1/2 , remplacez 0. Cela équivaut à remplacer⌈1-2p⌉
.)la source