Il existe une réponse exacte (sous la forme d'un produit matriciel, présenté au point 4 ci-dessous). Il existe un algorithme raisonnablement efficace pour le calculer, dérivant de ces observations:
Un mélange aléatoire de cartes peut être généré en mélangeant au hasard cartes et en intercalant ensuite au hasard les cartes restantes en leur sein.N+kNk
En mélangeant uniquement les as, puis (en appliquant la première observation) en intercalant les deux, puis les trois, etc., ce problème peut être considéré comme une chaîne de treize étapes.
Nous devons garder une trace de plus que la valeur de la carte que nous recherchons. En faisant cela, cependant, nous n'avons pas besoin de tenir compte de la position de la marque par rapport à toutes les cartes, mais seulement de sa position par rapport aux cartes de valeur égale ou inférieure.
Imaginez que vous placez une marque sur le premier as, puis que vous marquez les deux premiers trouvés après, et ainsi de suite. (Si à n'importe quel stade le jeu s'épuise sans afficher la carte que nous recherchons actuellement, nous laisserons toutes les cartes non marquées.) Soit la "place" de chaque marque (lorsqu'elle existe) soit le nombre de cartes de valeur égale ou inférieure qui ont été distribués lorsque la marque a été faite (y compris la carte marquée elle-même). Les lieux contiennent toutes les informations essentielles.
L'emplacement après la marque est un nombre aléatoire. Pour un jeu donné, la séquence de ces lieux forme un processus stochastique. Il s'agit en fait d'un processus de Markov (à matrice de transition variable). Une réponse exacte peut donc être calculée à partir de douze multiplications matricielles.ith
En utilisant ces idées, cette machine obtient une valeur de (calcul en virgule flottante double précision) en seconde. Cette approximation de la valeur exacte est précise pour tous les chiffres affichés.5.83258855290199651/9
1982600579265894785026945331968939023522542569339917784579447928182134345929899510000000000
Le reste de cet article fournit des détails, présente une implémentation fonctionnelle (en R
) et se termine par quelques commentaires sur la question et l'efficacité de la solution.
Générer des shuffles aléatoires d'un deck
Il est en fait plus clair sur le plan conceptuel et pas plus compliqué mathématiquement de considérer un "jeu" (aka multiset ) de cartes dont il y a de la plus petite dénomination, de la plus basse suivante, etc. . (La question posée concerne le jeu de cartes déterminé par le vecteur .)N=k1+k2+⋯+kmk1k213(4,4,…,4)
Un "mélange aléatoire" de cartes est une permutation prise uniformément et au hasard parmi les permutations des cartes. Ces shuffles se répartissent en groupes de configurations équivalentes parce que la permutation des "as" entre eux ne change rien, la permutation des "deux" entre eux ne change rien non plus, et ainsi de suite. Par conséquent, chaque groupe de permutations qui semblent identiques lorsque les combinaisons des cartes sont ignorées contientpermutations. Ces groupes, dont le nombre est donc donné par le coefficient multinomialN ! = N × ( NNN!=N×(N−1)×⋯×2×1Nk1k2k1!×k2!×⋯×km!
(Nk1,k2,…,km)=N!k1!k2!⋯km!,
sont appelés "combinaisons" du jeu.
Il existe une autre façon de compter les combinaisons. Les premières cartes ne peuvent former que combinaison. Ils laissent "emplacements" entre eux et autour d'eux dans lesquels les prochaines cartes peuvent être placées. Nous pourrions l'indiquer avec un diagramme où " " désigne l'une des cartes et " " désigne un emplacement pouvant contenir entre et cartes supplémentaires:k 1 !k1k1!/k1!=1k1+1k2∗k1_0k2
_∗_∗_⋯_∗_k1 stars
Lorsque cartes supplémentaires sont intercalées, le motif d'étoiles et de nouvelles cartes partitionne les cartes en deux sous-ensembles. Le nombre de ces sous-ensembles distincts est .k2k1+k2(k1+k2k1,k2)=(k1+k2)!k1!k2!
En répétant cette procédure avec "trois", nous constatons qu'il y a façons de les intercaler parmi les premières cartes. Par conséquent, le nombre total de façons distinctes d'organiser les premières cartes de cette manière est égal àk3((k1+k2)+k3k1+k2,k3)=(k1+k2+k3)!(k1+k2)!k3!k1+k2k1+k2+k3
1×(k1+k2)!k1!k2!×(k1+k2+k3)!(k1+k2)!k3!=(k1+k2+k3)!k1!k2!k3!.
Après avoir terminé les dernières cartes et continué à multiplier ces fractions télescopiques, nous constatons que le nombre de combinaisons distinctes obtenues est égal au nombre total de combinaisons comptées précédemment, . Nous n'avons donc négligé aucune combinaison. Cela signifie que ce processus séquentiel de mélange des cartes capture correctement les probabilités de chaque combinaison, en supposant qu'à chaque étape, chaque manière distincte possible d'interpénétrer les nouvelles cartes parmi les anciennes est prise avec une probabilité uniformément égale.kn(Nk1,k2,…,km)
Le processus d'endroit
Initialement, il y a as et évidemment le tout premier est marqué. Aux stades ultérieurs, il y a cartes, l'endroit (si une carte marquée existe) est égal à (une valeur de à ), et nous sommes sur le point de croiser cartes autour d'eux. Nous pouvons visualiser cela avec un diagramme comme n = k 1 + k 2k1n=k1+k2+⋯+kj−1p1nk=kj
_∗_∗_⋯_∗_p−1 stars⊙_∗_⋯_∗_n−p stars
où " " désigne le symbole actuellement marqué. Conditionnellement à cette valeur de la place , nous souhaitons trouver la probabilité que la prochaine place soit égale à (une valeur de à ; selon les règles du jeu, la prochaine place doit venir après , d'où ). Si nous pouvons trouver combien de façons il y a pour intercaler les nouvelles cartes dans les blancs afin que la prochaine place soit égale à , alors nous pouvons diviser par le nombre total de façons d'interpénétrer ces cartes (égal à , comme nous l'avons vu) pour obtenir le⊙pq1n+kpq≥p+1kq(n+kk)probabilité de transition que le lieu passe de à . (Il y aura également une probabilité de transition pour que l'endroit disparaisse complètement lorsqu'aucune des nouvelles cartes ne suit la carte marquée, mais il n'est pas nécessaire de le calculer explicitement.)pq
Mettons à jour le diagramme pour refléter cette situation:
_∗_∗_⋯_∗_p−1 stars⊙∗∗⋯∗s stars | _∗_⋯_∗_n−p−s stars
La barre verticale " " indique où la première nouvelle carte apparaît après la carte marquée: aucune nouvelle carte ne peut donc apparaître entre le et le (et donc aucun emplacement n'est affiché dans cet intervalle). Nous ne savons pas combien d'étoiles il y a dans cet intervalle, je viens donc de l'appeler (qui peut être zéro). L'inconnu disparaîtra une fois que nous aurons trouvé la relation entre lui et .|⊙|ssq
Supposons donc que nous entremêlons nouvelles cartes autour des étoiles avant le puis - indépendamment de cela - nous entremêlons les nouvelles cartes restantes autour des étoiles après le . Il y aj⊙k−j−1|
τn,k(s,p)=((p−1)+jj)((n−p−s)+(k−j)−1k−j−1)
façons de le faire. Remarquez cependant - c'est la partie la plus délicate de l'analyse - que la place de est égale à car|p+s+j+1
- Il y a "anciennes" cartes à la marque ou avant.p
- Il y a vieilles cartes après la marque , mais avant .s|
- Il y a nouvelles cartes avant la marque.j
- Il y a la nouvelle carte représentée par lui-même.|
Ainsi, nous donne des informations sur la transition du lieu au lieu . Lorsque nous suivons attentivement ces informations pour toutes les valeurs possibles de et que nous additionnons toutes ces possibilités (disjointes), nous obtenons la probabilité conditionnelle du lieu suivant le lieu ,τn,k(s,p)pq=p+s+j+1sqp
Prn,k(q|p)=(∑j(p−1+jj)(n+k−qk−j−1))/(n+kk)
où la somme commence à et se termine à . (La longueur variable de cette somme suggère qu'il y a ne sera probablement pas une formule fermée pour elle en fonction de et , sauf dans des cas particuliers.)j=max(0,q−(n+1))j=min(k−1,q−(p+1)n,k,q,p
L'algorithme
Initialement, il y a une probabilité que le lieu soit et une probabilité il aura toute autre valeur possible dans . Ceci peut être représenté par un vecteur .1102,3,…,k1p1=(1,0,…,0)
Après avoir intercalé les cartes suivantes, le vecteur est mis à jour à en le multipliant (à gauche) par la matrice de transition . Ceci est répété jusqu'à ce que toutes les aient été placées. A chaque étape , la somme des entrées du vecteur de probabilité est la chance que certaines cartes a été marquée. Tout ce qui reste pour rendre la valeur égale à est donc la chance qu'aucune carte ne soit laissée marquée après l'étapek2p1p2(Prk1,k2(q|p),1≤p≤k1,1≤q≤k2)k1+k2+⋯+kmjpj1j. Les différences successives de ces valeurs nous donnent donc la probabilité de ne pas trouver une carte de type à marquer: c'est la distribution de probabilité de la valeur de la carte que nous cherchions lorsque le jeu s'épuise à la fin de la partie .j
la mise en oeuvre
Le R
code suivant implémente l'algorithme. Il est parallèle à la discussion précédente. Tout d'abord, le calcul des probabilités de transition est effectué par t.matrix
(sans normalisation avec la division par , ce qui facilite le suivi des calculs lors du test du code):(n+kk)
t.matrix <- function(q, p, n, k) {
j <- max(0, q-(n+1)):min(k-1, q-(p+1))
return (sum(choose(p-1+j,j) * choose(n+k-q, k-1-j))
}
Ceci est utilisé par transition
pour mettre à jour en . Il calcule la matrice de transition et effectue la multiplication. Il prend également en charge le calcul du vecteur initial si l'argument est un vecteur vide:pj−1pjp1p
#
# `p` is the place distribution: p[i] is the chance the place is `i`.
#
transition <- function(p, k) {
n <- length(p)
if (n==0) {
q <- c(1, rep(0, k-1))
} else {
#
# Construct the transition matrix.
#
t.mat <- matrix(0, nrow=n, ncol=(n+k))
#dimnames(t.mat) <- list(p=1:n, q=1:(n+k))
for (i in 1:n) {
t.mat[i, ] <- c(rep(0, i), sapply((i+1):(n+k),
function(q) t.matrix(q, i, n, k)))
}
#
# Normalize and apply the transition matrix.
#
q <- as.vector(p %*% t.mat / choose(n+k, k))
}
names(q) <- 1:(n+k)
return (q)
}
Nous pouvons maintenant facilement calculer les probabilités non marquées à chaque étape pour n'importe quel deck:
#
# `k` is an array giving the numbers of each card in order;
# e.g., k = rep(4, 13) for a standard deck.
#
# NB: the *complements* of the p-vectors are output.
#
game <- function(k) {
p <- numeric(0)
q <- sapply(k, function(i) 1 - sum(p <<- transition(p, i)))
names(q) <- names(k)
return (q)
}
Les voici pour le deck standard:
k <- rep(4, 13)
names(k) <- c("A", 2:9, "T", "J", "Q", "K")
(g <- game(k))
La sortie est
A 2 3 4 5 6 7 8 9 T J Q K
0.00000000 0.01428571 0.09232323 0.25595013 0.46786622 0.66819134 0.81821790 0.91160622 0.96146102 0.98479430 0.99452614 0.99818922 0.99944610
Selon les règles, si un roi était marqué, nous ne chercherions plus de cartes: cela signifie que la valeur de doit être augmentée à . Ce faisant, les différences donnent la distribution du "numéro sur lequel vous serez lorsque le jeu sera épuisé":0.99944611
> g[13] <- 1; diff(g)
2 3 4 5 6 7 8 9 T J Q K
0.014285714 0.078037518 0.163626897 0.211916093 0.200325120 0.150026562 0.093388313 0.049854807 0.023333275 0.009731843 0.003663077 0.001810781
(Comparez cela à la sortie que je rapporte dans une réponse séparée décrivant une simulation de Monte-Carlo: ils semblent être les mêmes, jusqu'à des niveaux de variation aléatoire attendus.)
La valeur attendue est immédiate:
> sum(diff(g) * 2:13)
[1] 5.832589
Tout compte fait, cela ne nécessitait qu'une douzaine de lignes environ de code exécutable. Je l'ai vérifié par rapport aux calculs manuels pour les petites valeurs de (jusqu'à ). Ainsi, si une divergence apparaît entre le code et l'analyse précédente du problème, faites confiance au code (car l'analyse peut contenir des erreurs typographiques).k3
Remarques
Relations avec d'autres séquences
Lorsqu'il y en a une de chaque carte, la distribution est une séquence de réciproques de nombres entiers:
> 1/diff(game(rep(1,10)))
[1] 2 3 8 30 144 840 5760 45360 403200
La valeur à l'endroit est(à partir de la place ). Il s'agit de la séquence A001048 dans l'Encyclopédie en ligne des séquences de nombres entiers. En conséquence, nous pourrions espérer une formule fermée pour les ponts à constant (les ponts "adaptés") qui généraliserait cette séquence, qui a elle-même des significations profondes. (Par exemple, il compte les tailles des plus grandes classes de conjugaison dans les groupes de permutation et est également lié aux coefficients trinomiaux .) (Malheureusement, les inverses dans la généralisation pour ne sont généralement pas des nombres entiers.)ii!+(i−1)!i=1kik>1
Le jeu comme processus stochastique
Notre analyse montre clairement que les coefficients initiaux des vecteurs , , sont constants. Par exemple, suivons la sortie de car il traite chaque groupe de cartes:ipjj≥igame
> sapply(1:13, function(i) game(rep(4,i)))
[[1]]
[1] 0
[[2]]
[1] 0.00000000 0.01428571
[[3]]
[1] 0.00000000 0.01428571 0.09232323
[[4]]
[1] 0.00000000 0.01428571 0.09232323 0.25595013
...
[[13]]
[1] 0.00000000 0.01428571 0.09232323 0.25595013 0.46786622 0.66819134 0.81821790 0.91160622 0.96146102 0.98479430 0.99452614 0.99818922 0.99944610
Par exemple, la deuxième valeur du vecteur final (décrivant les résultats avec un jeu complet de 52 cartes) est déjà apparue après le traitement du deuxième groupe (et est égale à ). Ainsi, si vous souhaitez uniquement des informations sur les marques jusqu'à la valeur de la carte , il vous suffit d'effectuer le calcul pour un jeu de .jème1/(84)=1/70jthk1+k2+⋯+kj
Parce que la chance de ne pas marquer une carte de valeur se rapproche rapidement de mesure que augmente, après types de cartes dans quatre couleurs, nous avons presque atteint une valeur limite pour l'attente. En effet, la valeur limite est d'environ (calculée pour un jeu de cartes, point auquel l'erreur d'arrondi double précision empêche d'aller plus loin).1j1j135.8333554×32
Horaire
En regardant l'algorithme appliqué au vecteur , nous voyons que son timing devrait être proportionnel à et - en utilisant une limite supérieure brute - pas pire que proportionnel à . En chronométrant tous les calculs pour à et à , et en analysant uniquement ceux qui prennent des temps relativement longs ( seconde ou plus), j'estime que le temps de calcul est approximativement , soutenant cette évaluation de la limite supérieure.( k , k , … , k ) k 2 m 3 k = 1 7 n = 10 30m(k,k,…,k)k2m3k=17n=1030O ( k 2 n 2.9 )1/2O(k2n2.9)
Une utilisation de ces asymptotiques est de projeter des temps de calcul pour des problèmes plus importants. Par exemple, vu que le cas prend environ seconde, nous estimons que le cas (très intéressant) prendrait environ secondes. (Cela prend en fait secondes.)1,31 k = 1 , n = 100 1,31 ( 1 / 4 ) 2 ( 100 / 30 ) 2,9 ≈ 2,7 2,87k=4,n=301.31k=1,n=1001.31(1/4)2(100/30)2.9≈2.72.87