J'ai déjà posé une question sur la façon de calculer une probabilité rapidement et avec précision. Cependant, c'était évidemment trop facile car une solution sous forme fermée a été donnée! Voici une version plus difficile.
Cette tâche consiste à écrire du code pour calculer une probabilité exactement et rapidement . La sortie doit être une probabilité précise écrite sous forme de fraction dans sa forme la plus réduite. C'est-à-dire qu'il ne devrait jamais sortir 4/8
mais plutôt 1/2
.
Pour un entier positif n
, considérez une chaîne uniformément aléatoire de 1 et -1 de longueur n
et appelez-la A. Maintenant, concaténez à A
une copie d'elle-même. C'est A[1] = A[n+1]
si l'indexation à partir de 1, A[2] = A[n+2]
et ainsi de suite. A
a maintenant une longueur 2n
. Considérons maintenant également une deuxième chaîne aléatoire de longueur n
dont les premières n
valeurs sont -1, 0 ou 1 avec probabilité 1 / 4,1 / 2, 1/4 chacune et appelons-la B.
Considérez maintenant le produit intérieur de B
avec A[1+j,...,n+j]
pour différent j =0,1,2,...
.
Par exemple, réfléchissez n=3
. Les valeurs possibles pour A
et B
pourraient être A = [-1,1,1,-1,...]
et B=[0,1,-1]
. Dans ce cas, les deux premiers produits intérieurs sont 0
et 2
.
Tâche
Pour chacun j
, en commençant par j=1
, votre code devrait afficher la probabilité que tous les premiers j+1
produits internes soient nuls pour tous n=j,...,50
.
En copiant le tableau produit par Martin Büttner pour j=1
nous avons les exemples de résultats suivants.
n P(n)
1 1/2
2 3/8
3 7/32
4 89/512
5 269/2048
6 903/8192
7 3035/32768
8 169801/2097152
But
Votre score est le plus élevé que j
votre code complète en 1 minute sur mon ordinateur. Pour clarifier un peu, chacun j
obtient une minute. Notez que le code de programmation dynamique de la question liée précédente le fera facilement j=1
.
Tie break
Si deux entrées obtiennent le même j
score, l'entrée gagnante sera celle qui atteint le plus haut n
en une minute sur ma machine pour cela j
. Si les deux meilleures entrées sont également égales sur ce critère, le gagnant sera la réponse soumise en premier.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue et bibliothèque librement disponibles. Je dois être en mesure d'exécuter votre code, veuillez donc inclure une explication complète sur la façon d'exécuter / compiler votre code sous Linux si possible.
Ma machine Les horaires seront exécutés sur ma machine. Il s'agit d'une installation ubuntu standard sur un processeur AMD FX-8350 à huit cœurs. Cela signifie également que je dois pouvoir exécuter votre code.
Entrées gagnantes
j=2
en Python par Mitch Schwartz.j=2
en Python par feersum. Actuellement l'entrée la plus rapide.
la source
Réponses:
Python 2, j = 2
J'ai essayé de trouver une sorte de «forme fermée» pour j = 2. Je pourrais peut-être en faire une image MathJax, même si ce serait vraiment moche avec tous les tripotages d'index. J'ai écrit ce code non optimisé uniquement pour tester la formule. Il faut environ 1 seconde pour terminer. Les résultats correspondent au code de Mitch Schwartz.
Considérons une séquence où le ième membre est
e
si A [i] == A [i + 1] oun
si A [i]! = A [i + 1].i
dans le programme est le nombre den
s. Sii
est pair, la séquence doit commencer et se terminer pare
. Sii
est impair, la séquence doit commencer et se terminer parn
. Les séquences sont en outre classées selon le nombre d'exécutions dee
s oun
s consécutifs . Il y aj
+1 de l'un etj
de l'autre.Lorsque l'idée de marche aléatoire est étendue à 3 dimensions, il y a un problème regrettable qu'il ya 4 directions possibles pour marcher dans (un pour chacun
ee
,en
,ne
ounn
) ils ne sont pas linéairement dépendants qui moyens. Ainsi, l'k
indice totalise le nombre de pas effectués dans l'une des directions (1, 1, 1). Ensuite, il y aura un nombre exact d'étapes qui doivent être prises dans les 3 autres directions pour l'annuler.P (n, p) donne le nombre de partitions ordonnées de n objets en p parties. W (l, d) donne le nombre de façons dont une marche aléatoire de
l
pas parcourt une distance exacted
. Comme auparavant, il y a 1 chance de se déplacer à gauche, 1 chance de se déplacer à droite et 2 de rester en place.la source
j=3
. Ce serait génial!Python, j = 2
L'approche de programmation dynamique pour
j = 1
dans ma réponse à la question précédente n'a pas besoin de beaucoup de modifications pour fonctionner plus hautj
, mais devient lente rapidement. Tableau de référence:Et le code:
Nous gardons ici la trace des deux premiers éléments de
A
, les deux derniers éléments deB
(oùb2
est le dernier élément), et les produits internes de(A[:n], B)
,(A[1:n], B[:-1])
et(A[2:n], B[:-2])
.la source