Có một câu trả lời chính xác (dưới dạng một sản phẩm ma trận, được trình bày ở điểm 4 bên dưới). Một thuật toán hợp lý hiệu quả để tính toán nó tồn tại, xuất phát từ những quan sát sau:
Việc xáo trộn ngẫu nhiên các thẻ có thể được tạo ra bằng cách xáo trộn ngẫu nhiên các thẻ N và sau đó xen kẽ ngẫu nhiên các thẻ k còn lại trong chúng.N+kNk
Bằng cách xáo trộn chỉ những con át chủ bài, và sau đó (áp dụng quan sát đầu tiên) xen kẽ các twos, sau đó là ba, v.v., vấn đề này có thể được xem như một chuỗi mười ba bước.
Chúng tôi cần theo dõi nhiều hơn giá trị của thẻ mà chúng tôi đang tìm kiếm. Tuy nhiên, khi làm điều này, chúng ta không cần tính đến vị trí của nhãn hiệu so với tất cả các thẻ, mà chỉ vị trí của nó so với các thẻ có giá trị bằng hoặc nhỏ hơn.
Hãy tưởng tượng đặt một dấu trên ace đầu tiên, và sau đó đánh dấu hai cái đầu tiên được tìm thấy sau nó, v.v. (Nếu ở bất kỳ giai đoạn nào bộ bài hết mà không hiển thị thẻ mà chúng tôi hiện đang tìm kiếm, chúng tôi sẽ để lại tất cả các thẻ không được đánh dấu.) Đặt "vị trí" của mỗi dấu (khi nó tồn tại) là số lượng thẻ có giá trị bằng hoặc thấp hơn đã được xử lý khi nhãn hiệu được thực hiện (bao gồm cả thẻ được đánh dấu). Những nơi chứa tất cả các thông tin cần thiết.
Vị trí sau dấu thứ được tạo là một số ngẫu nhiên. Đối với một bộ bài nhất định, trình tự của những nơi này tạo thành một quá trình ngẫu nhiên. Thực tế nó là một quá trình Markov (với ma trận chuyển tiếp biến). Do đó, một câu trả lời chính xác có thể được tính từ mười hai phép nhân ma trận.ith
Sử dụng những ý tưởng này, máy này có được một giá trị của (tính toán trong đôi điểm nổi chính xác) trong 1 / 9 giây. Giá trị gần đúng này của giá trị chính xác 19826005792658947850269453319689390235225425695.83258855290199651/9 chính xác với tất cả các chữ số được hiển thị.
1982600579265894785026945331968939023522542569339917784579447928182134345929899510000000000
Phần còn lại của bài viết này cung cấp chi tiết, trình bày một triển khai làm việc (trong R
) và kết luận với một số ý kiến về câu hỏi và hiệu quả của giải pháp.
Tạo ra sự xáo trộn ngẫu nhiên của một bộ bài
Đó là thực sự rõ ràng khái niệm và không phức tạp về mặt toán học để xem xét một "boong" (aka MultiSet ) của thẻ trong đó có k 1 của giáo phái thấp nhất, k 2 của tiếp theo thấp nhất, v.v. (Các câu hỏi như mối quan tâm hỏi những boong xác định bởi 13 -vector ( 4 , 4 , ... , 4 ) .)N=k1+k2+⋯+kmk1k213(4,4,…,4)
Một "ngẫu nhiên ngẫu nhiên" của thẻ là một hoán vị được thực hiện thống nhất và ngẫu nhiên từ N ! = N × ( N - 1 ) × ⋯ × 2 × 1 hoán vị của thẻ N. Các xáo trộn này rơi vào các nhóm có cấu hình tương đương vì việc hoán vị k 1 "aces" trong số chúng không thay đổi gì, cho phép k 2 "twos" trong số chúng cũng không thay đổi gì, v.v. Do đó, mỗi nhóm hoán vị trông giống hệt nhau khi bộ đồ của thẻ bị bỏ qua chứa k 1 !NN!=N×(N−1)×⋯×2×1Nk1k2hoán vị. Các nhóm này, do đó số lượng được đưa ra bởihệ số đa thứck1!×k2!×⋯×km!
(Nk1,k2,…,km)=N!k1!k2!⋯km!,
được gọi là "sự kết hợp" của bộ bài.
Có một cách khác để đếm các kết hợp. Thẻ đầu tiên chỉ có thể tạo thành k 1 ! / k 1 ! = 1 kết hợp. Chúng để lại k 1 + 1 "khe" giữa và xung quanh chúng, trong đó các thẻ k 2 tiếp theo có thể được đặt. Chúng ta có thể cho biết điều này với một sơ đồ nơi " * " chỉ định một trong những k 1 thẻ và " _ " chỉ định một khe cắm có thể chứa giữa 0 và k 2 thẻ bổ sung:k1k1!/k1!=1k1+1k2∗k1_0k2
_∗_∗_⋯_∗_k1 stars
Khi thẻ bổ sung được xen kẽ, mô hình của các ngôi sao và thẻ mới phân chia các thẻ k 1 + k 2 thành hai tập con. Số lượng các tập con khác nhau như vậy là ( k 1 + k 2k2k1+k2.(k1+k2k1,k2)=(k1+k2)!k1!k2!
Lặp lại quy trình này với "threes", chúng tôi thấy có ( ( k 1 + k 2 ) + k 3k3cách để xen kẽ chúng trong số các thẻk1+k2đầu tiên. Do đó, tổng số cách khác nhau để sắp xếp các thẻk1+k2+k3đầu tiêntheo cách này bằng((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!.
Sau khi hoàn thành các thẻ cuối cùng và tiếp tục nhân các phân số kính thiên văn này, chúng tôi thấy rằng số lượng kết hợp riêng biệt thu được bằng tổng số kết hợp như đã tính trước đó, ( Nkn. Vì vậy, chúng tôi đã bỏ qua không có sự kết hợp. Điều đó có nghĩa làquá trình xáo trộn tuần tự các thẻ này nắm bắt chính xác xác suất của mỗi kết hợp,giả sử rằng ở mỗi giai đoạn, mỗi cách khác nhau có thể xen kẽ các thẻ mới giữa các thẻ cũ được thực hiện với xác suất đồng đều.(Nk1,k2,…,km)
Quá trình diễn ra
Ban đầu, có aces và rõ ràng đầu tiên được đánh dấu. Ở các giai đoạn sau có n = k 1 + k 2 + ⋯ + k j - 1 thẻ, địa điểm (nếu thẻ đánh dấu tồn tại) bằng p (một số giá trị từ 1 đến n ), và chúng tôi sắp đặt lộn nhau k = k thẻ j xung quanh họ. Chúng ta có thể hình dung điều này với một sơ đồ nhưk1n=k1+k2+⋯+kj−1p1nk=kj
_∗_∗_⋯_∗_p−1 stars⊙_∗_⋯_∗_n−p stars
trong đó " " chỉ định biểu tượng hiện được đánh dấu. Có điều kiện về giá trị này của nơi p , chúng tôi mong muốn tìm ra xác suất mà địa điểm tiếp theo sẽ bằng q (một số giá trị từ 1 đến n + k ; bởi các quy tắc của trò chơi, địa điểm tiếp theo phải đến sau p , đâu q ≥ p + 1 ). Nếu chúng ta có thể tìm thấy có bao nhiêu cách để có vãi ra các k thẻ mới vào chỗ trống sao cho địa điểm tiếp theo bằng q , sau đó chúng ta có thể chia cho tổng số cách để vãi ra các thẻ (tương đương với (⊙pq1n+kpq≥p+1kq , như chúng ta đã thấy) để có đượcxác suất chuyển tiếpmà địa điểm thay đổi từpsangq. (Cũng sẽ có xác suất chuyển tiếp cho địa điểm biến mất hoàn toàn khi không có thẻ mới nào theo thẻ được đánh dấu, nhưng không cần phải tính toán rõ ràng điều này.)(n+kk)pq
Hãy cập nhật sơ đồ để phản ánh tình huống này:
_∗_∗_⋯_∗_p−1 stars⊙∗∗⋯∗s stars | _∗_⋯_∗_n−p−s stars
Các thanh dọc " " show nơi thẻ mới đầu tiên xảy ra sau khi thẻ đánh dấu: không có thẻ mới có thể xuất hiện do đó giữa ⊙ và | (và do đó không có vị trí nào được hiển thị trong khoảng đó). Chúng tôi không biết có bao nhiêu ngôi sao có trong khoảng thời gian này, vì vậy tôi vừa gọi nó s (có thể không) Các chưa biết s sẽ biến mất khi chúng ta thấy mối quan hệ giữa nó và q .|⊙|ssq
Suppose, then, we intersperse j new cards around the stars before the ⊙ and then--independently of that--we intersperse the remaining k−j−1 new cards around the stars after the |. There are
τn,k(s,p)=((p−1)+jj)((n−p−s)+(k−j)−1k−j−1)
ways to do this. Notice, though--this is the trickiest part of the analysis--that the place of | equals p+s+j+1 because
- There are p "old" cards at or before the mark.
- There are s old cards after the mark but before |.
- There are j new cards before the mark.
- There is the new card represented by | itself.
Thus, τn,k(s,p) gives us information about the transition from place p to place q=p+s+j+1. When we track this information carefully for all possible values of s, and sum over all these (disjoint) possibilities, we obtain the conditional probability of place q following place p,
Prn,k(q|p)=(∑j(p−1+jj)(n+k−qk−j−1))/(n+kk)
where the sum starts at j=max(0,q−(n+1)) and ends at j=min(k−1,q−(p+1). (The variable length of this sum suggests there is unlikely to be a closed formula for it as a function of n,k,q, and p, except in special cases.)
The algorithm
Initially there is probability 1 that the place will be 1 and probability 0 it will have any other possible value in 2,3,…,k1. This can be represented by a vector p1=(1,0,…,0).
After interspersing the next k2 cards, the vector p1 is updated to p2 by multiplying it (on the left) by the transition matrix (Prk1,k2(q|p),1≤p≤k1,1≤q≤k2). This is repeated until all k1+k2+⋯+km cards have been placed. At each stage j, the sum of the entries in the probability vector pj is the chance that some card has been marked. Whatever remains to make the value equal to 1 therefore is the chance that no card is left marked after step j. The successive differences in these values therefore give us the probability that we could not find a card of type j to mark: that is the probability distribution of the value of the card we were looking for when the deck runs out at the end of the game.
Implementation
The following R
code implements the algorithm. It parallels the preceding discussion. First, calculation of the transition probabilities is performed by t.matrix
(without normalization with the division by (n+kk), making it easier to track the calculations when testing the code):
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))
}
This is used by transition
to update pj−1 to pj. It calculates the transition matrix and performs the multiplication. It also takes care of computing the initial vector p1 if the argument p
is an empty vector:
#
# `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)
}
We can now easily compute the non-mark probabilities at each stage for any 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)
}
Here they are for the standard deck:
k <- rep(4, 13)
names(k) <- c("A", 2:9, "T", "J", "Q", "K")
(g <- game(k))
The output is
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
According to the rules, if a king was marked then we would not look for any further cards: this means the value of 0.9994461 has to be increased to 1. Upon doing so, the differences give the distribution of the "number you will be on when the deck runs out":
> 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
(Compare this to the output I report in a separate answer describing a Monte-Carlo simulation: they appear to be the same, up to expected amounts of random variation.)
The expected value is immediate:
> sum(diff(g) * 2:13)
[1] 5.832589
All told, this required only a dozen lines or so of executable code. I have checked it against hand calculations for small values of k (up to 3). Thus, if any discrepancy becomes apparent between the code and the preceding analysis of the problem, trust the code (because the analysis may have typographical errors).
Remarks
Relationships to other sequences
When there is one of each card, the distribution is a sequence of reciprocals of whole numbers:
> 1/diff(game(rep(1,10)))
[1] 2 3 8 30 144 840 5760 45360 403200
The value at place i is i!+(i−1)! (starting at place i=1). This is sequence A001048 in the Online Encyclopedia of Integer Sequences. Accordingly, we might hope for a closed formula for the decks with constant ki (the "suited" decks) that would generalize this sequence, which itself has some profound meanings. (For instance, it counts sizes of the largest conjugacy classes in permutation groups and is also related to trinomial coefficients.) (Unfortunately, the reciprocals in the generalization for k>1 are not usually integers.)
The game as a stochastic process
Our analysis makes it clear that the initial i coefficients of the vectors pj, j≥i, are constant. For example, let's track the output of game
as it processes each group of cards:
> 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
For instance, the second value of the final vector (describing the results with a full deck of 52 cards) already appeared after the second group was processed (and equals 1/(84)=1/70). Thus, if you want information only about the marks up through the jth card value, you only have to perform the calculation for a deck of k1+k2+⋯+kj cards.
Because the chance of not marking a card of value j is getting quickly close to 1 as j increases, after 13 types of cards in four suits we have almost reached a limiting value for the expectation. Indeed, the limiting value is approximately 5.833355 (computed for a deck of 4×32 cards, at which point double precision rounding error prevents going any further).
Timing
Looking at the algorithm applied to the m-vector (k,k,…,k), we see its timing should be proportional to k2 and--using a crude upper bound--not any worse than proportional to m3. By timing all calculations for k=1 through 7 and n=10 through 30, and analyzing only those taking relatively long times (1/2 second or longer), I estimate the computation time is approximately O(k2n2.9), supporting this upper-bound assessment.
One use of these asymptotics is to project calculation times for larger problems. For instance, seeing that the case k=4,n=30 takes about 1.31 seconds, we would estimate that the (very interesting) case k=1,n=100 would take about 1.31(1/4)2(100/30)2.9≈2.7 seconds. (It actually takes 2.87 seconds.)