Dokładna odpowiedź (w postaci iloczynu matrycowego, przedstawiona w punkcie 4 poniżej). Istnieje dość wydajny algorytm do jego obliczenia, wynikający z następujących obserwacji:
Losowe tasowanie kart można wygenerować przez losowe tasowanie N kart, a następnie losowe przeplatanie pozostałych w nich kart k .N+kNk
Tasując tylko asy, a następnie (stosując pierwszą obserwację) przeplatając dwójki, potem trójki itd., Problem ten można postrzegać jako łańcuch trzynastu kroków.
Musimy śledzić więcej niż wartość szukanej karty. Robiąc to, nie musimy jednak uwzględniać pozycji znaku względem wszystkich kart, a jedynie jego pozycję w stosunku do kart o takiej samej lub mniejszej wartości.
Wyobraź sobie, że umieszczasz znak na pierwszym asie, a następnie zaznaczasz pierwsze dwa znalezione po nim i tak dalej. (Jeśli na którymś etapie talia się skończy bez wyświetlania karty, której aktualnie szukamy, nie zaznaczymy wszystkich kart.) Niech „miejscem” każdego znaku (jeśli istnieje) jest liczba kart o takiej samej lub niższej wartości, zostały rozdane, gdy znak został wykonany (w tym sama karta oznaczona). Miejsca zawierają wszystkie niezbędne informacje.
ith
5.83258855290199651/9
1982600579265894785026945331968939023522542569339917784579447928182134345929899510000000000
Pozostała część tego postu zawiera szczegółowe informacje, przedstawia działającą implementację (in R
) i kończy się komentarzami na temat pytania i wydajności rozwiązania.
Generowanie losowych przetasowań talii
N=k1+k2+⋯+kmk1k213(4,4,…,4)
NN!=N×(N−1)×⋯×2×1Nk1k2k1!×k2!×⋯×km!
(Nk1,k2,…,km)=N!k1!k2!⋯km!,
nazywane są „kombinacjami” talii.
k1k1!/k1!=1k1+1k2∗k1_0k2
_∗_∗_⋯_∗_k1 stars
k2k1+k2(k1+k2k1,k2)=(k1+k2)!k1!k2!
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!.
kn(Nk1,k2,…,km)
Proces miejsca
k1n=k1+k2+⋯+kj−1p1nk=kj
_∗_∗_⋯_∗_p−1 stars⊙_∗_⋯_∗_n−p stars
⊙pq1n+kpq≥p+1kq(n+kk)pq
Zaktualizujmy diagram, aby odzwierciedlał tę sytuację:
_∗_∗_⋯_∗_p−1 stars⊙∗∗⋯∗s stars | _∗_⋯_∗_n−p−s stars
|⊙|ssq
j⊙k−j−1|
τn,k(s,p)=((p−1)+jj)((n−p−s)+(k−j)−1k−j−1)
|p+s+j+1
τn,k(s,p)pq=p+s+j+1sqp
Prn,k(q|p)=(∑j(p−1+jj)(n+k−qk−j−1))/(n+kk)
j=max(0,q−(n+1))j=min(k−1,q−(p+1)n,k,q,p
Algorytm
1102,3,…,k1p1=(1,0,…,0)
k2p1p2(Prk1,k2(q|p),1≤p≤k1,1≤q≤k2)k1+k2+⋯+kmjpj1jj
Realizacja
R
t.matrix
(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))
}
transition
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)
}
Możemy teraz łatwo obliczyć prawdopodobieństwa nieoznaczone na każdym etapie dla dowolnej talii:
#
# `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)
}
Oto one dla standardowej talii:
k <- rep(4, 13)
names(k) <- c("A", 2:9, "T", "J", "Q", "K")
(g <- game(k))
Dane wyjściowe to
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
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
(Porównaj to z wynikami, które zgłaszam w osobnej odpowiedzi opisującej symulację Monte-Carlo: wydają się być takie same, do oczekiwanych wielkości losowych zmian).
Oczekiwana wartość jest natychmiastowa:
> sum(diff(g) * 2:13)
[1] 5.832589
k3
Uwagi
Związki z innymi sekwencjami
Kiedy jest jedna z każdej karty, rozkład jest sekwencją odwrotności liczb całkowitych:
> 1/diff(game(rep(1,10)))
[1] 2 3 8 30 144 840 5760 45360 403200
ii!+(i−1)!i=1kik>1
Gra jako proces stochastyczny
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
1/(84)=1/70jthk1+k2+⋯+kj
j1j135.8333554×32
wyczucie czasu
m(k,k,…,k)k2m3k=17n=10301/2O(k2n2.9)
k=4,n=301.31k=1,n=1001.31(1/4)2(100/30)2.9≈2.72.87