Interviewstreet a eu son deuxième CodeSprint en janvier qui comprenait la question ci-dessous. La réponse programmatique est publiée mais ne comprend pas d'explication statistique.
(Vous pouvez voir le problème d'origine et la solution publiée en vous connectant au site Interviewstreet avec Google Creds, puis en accédant au problème Coin Tosses à partir de cette page .)
Lancer de pièces
Vous avez une pièce impartiale que vous souhaitez continuer à lancer jusqu'à ce que vous obteniez N têtes consécutives. Vous avez lancé la pièce M fois et, étonnamment, tous les lancers ont donné lieu à des têtes.
Quel est le nombre attendu de lancers supplémentaires nécessaires jusqu'à ce que vous obteniez N têtes consécutives?
Contribution:
La première ligne contient le nombre de cas T. Chacune des T lignes suivantes contient deux nombres N et M.
Production:
sortie T lignes contenant la réponse pour le cas de test correspondant. Imprimez la réponse arrondie à exactement 2 décimales.
Exemple d'entrée:
4
2 0
2 1
3 3
3 2
Exemple de sortie:
6,00
4,00
0,00
8,00
Exemples d'explications:
Si N = 2 et M = 0, vous devez continuer à lancer la pièce jusqu'à ce que vous obteniez 2 têtes consécutives. Il n'est pas difficile de montrer qu'en moyenne, 6 lancers de pièces sont nécessaires.
Si N = 2 et M = 1, vous avez besoin de 2 têtes consécutives et vous en avez déjà 1. Vous devez lancer une fois de plus quoi qu'il arrive. Dans ce premier lancer, si vous obtenez des têtes, vous avez terminé. Sinon, vous devez recommencer, car le compteur consécutif se réinitialise, et vous devez continuer à lancer la pièce jusqu'à ce que vous obteniez N = 2 têtes consécutives. Le nombre attendu de lancers de pièces est donc de 1 + (0,5 * 0 + 0,5 * 6) = 4,0 Si N = 3 et M = 3, vous avez déjà 3 têtes, vous n'avez donc plus besoin de lancer.
Toutes les équations mathématiques que j'ai trouvées avaient les bonnes réponses pour les données d'entrée d'échantillon énumérées ci-dessus, mais elles étaient incorrectes pour tous leurs autres ensembles d'entrée (qui ne sont pas connus). Leur solution programmatique semble résoudre le problème bien différemment de ma méthode d'essayer de trouver une équation. Quelqu'un peut-il expliquer comment trouver une équation qui pourrait résoudre ce problème?
la source
Réponses:
Il s'agit d'un exercice de calcul, pensez donc de manière récursive . L'état actuel du retournement des pièces est déterminé par la paire ordonnée avec N ≥ M ≥ 0 . Soit le nombre attendu de flips pour atteindre N têtes consécutives e ( N , M ) :( N, M) N≥ M≥ 0 N e ( N, M)
(1) Il y a 50% de chances que le prochain flip soit des têtes, vous amenant à l'état , et 50% de chances que le prochain flip soit des queues, vous amenant à l'état ( N , 0 ) . Cela coûte un flip. Par conséquent, l'attente (récursive) est donnée par( N, M+ 1 ) ( N, 0 )
(2) Conditions de base: vous avez déjà stipulé que
et évidemment
(plus de flips ne sont nécessaires).
Voici le programme Mathematica correspondant (y compris la mise en cache des résultats intermédiaires pour accélérer la récursivité, ce qui en fait une solution de programmation dynamique):
Le programme serait similaire dans d'autres langages de programmation qui prennent en charge la récursivité. Mathématiquement, on peut vérifier que simplement en vérifiant la récursivité, car elle vaut évidemment pour les cas de base:e ( N, M) = 2N+ 1- 2M+ 1
ce qui est vrai pour tout et N , QED.M N
Plus généralement , la même approche établira que lorsque la pièce a une probabilitépde têtes. La partie difficile élabore la condition de basee(N,0). Cela se fait en chassant la récurrence deNétapes jusqu'à ce que finalemente(N,0)soit exprimé en termes de lui-même et en résolvant:e ( N, M) = p- N- p- M1 - p p e ( N, 0 ) N e ( N, 0 )
la source
find_x(n)
if n=0 return 1 else return 2*find_x(n-1)
find_x
y = 1; while n > 0 do begin y=2*y; n=n-1 end; return y
R
), ils ne diffèrent guère du tout. (Dans un cas, vous créez puis traitez un vecteur1:n
et dans l'autre, vous découvrirez qu'iln:1
a été placé sur la pile et traité à l'envers.) Mais une partie de mon argumentation était conceptuelle : votre commentaire initial parlait de "travailler de manière itérative". Cela faisait référence à l' analyse et non à un programme informatique. Mais ce sont des points triviaux et tangentiels dont la discussion ne justifie pas d'étendre ce fil de commentaires.Pour résoudre ce problème, j'utiliserai des processus stochastiques, des temps d'arrêt et une programmation dynamique.
Tout d'abord, quelques définitions:
Le premier correspond au nombre attendu de flips avant d'obtenir une queue en supposant qu'une queue est retournée avant que N têtes consécutives soient observées en supposant que nous commençons avec M têtes consécutives. Il n'est pas trop difficile de voir que
Maintenant, tout ce que nous avons à faire est de calculer la deuxième attente conditionnelle qui correspond au nombre attendu de flips nécessaires pour observer N têtes consécutives à partir de 0. Avec des calculs similaires, nous voyons que
Cela donne une réponse finale de:
Cela correspond aux quatre cas de test que vous avez répertoriés. Avec une réponse aussi simple, il peut y avoir un moyen plus simple de calculer cela.
la source
Avertissement: ce qui suit peut ne pas être considéré comme une bonne réponse dans la mesure où il ne fournit pas une solution de forme fermée à la question, en particulier. par rapport aux réponses précédentes . J'ai cependant trouvé l'approche suffisamment intéressante pour élaborer la distribution conditionnelle.
la source