एक सटीक उत्तर है (मैट्रिक्स उत्पाद के रूप में, नीचे बिंदु 4 में प्रस्तुत किया गया है)। इन अवलोकनों से व्युत्पन्न, गणना करने के लिए एक उचित कुशल एल्गोरिथ्म मौजूद है:
की एक यादृच्छिक फेरबदल कार्ड बेतरतीब ढंग से फेरबदल से उत्पन्न किया जा सकता कार्ड और फिर बेतरतीब ढंग से interspersing शेष उनके भीतर कार्ड।N+kNk
केवल इक्के को हिलाकर, और फिर (पहले अवलोकन को लागू करते हुए) टहनियों को फिर से काटना, फिर थ्रेशर्स, और इसी तरह, इस समस्या को तेरह चरणों की एक श्रृंखला के रूप में देखा जा सकता है।
हमें उस कार्ड के मूल्य से अधिक का ट्रैक रखने की आवश्यकता है जो हम मांग रहे हैं। हालांकि, ऐसा करते समय , हमें सभी कार्डों के सापेक्ष चिह्न की स्थिति के लिए खाते की आवश्यकता नहीं है, लेकिन समान या छोटे मूल्य के कार्ड के सापेक्ष केवल इसकी स्थिति।
पहले इक्का पर एक निशान रखने की कल्पना करें, और उसके बाद पाए गए पहले दो को चिह्नित करें, और इसी तरह। (यदि किसी भी स्तर पर डेक उस कार्ड को प्रदर्शित किए बिना बाहर चला जाता है जिसे हम वर्तमान में मांग रहे हैं, तो हम सभी कार्डों को बिना चिन्हित किए छोड़ देंगे।) प्रत्येक चिह्न के "स्थान" (जब वह मौजूद हो) को समान या निम्न मान के कार्ड की संख्या दें। जब चिह्न बनाया गया था (तब चिह्नित कार्ड सहित)। स्थानों में सभी आवश्यक जानकारी होती है।
चिह्न के बाद का स्थान एक यादृच्छिक संख्या है। किसी दिए गए डेक के लिए, इन स्थानों का क्रम एक स्टोकेस्टिक प्रक्रिया बनाता है। यह वास्तव में एक मार्कोव प्रक्रिया है (चर संक्रमण मैट्रिक्स के साथ)। इसलिए सटीक उत्तर की गणना बारह मैट्रिक्स गुणा से की जा सकती है।ith
इन विचारों का उपयोग करते हुए, यह मशीन सेकंड में (दोहरे सटीक फ्लोटिंग पॉइंट में कंप्यूटिंग) का मान प्राप्त करती है । यह सटीक मान में दिखाया गया है, जो सभी अंकों के लिए सटीक है।5.83258855290199651/9
1982600579265894785026945331968939023522542569339917784579447928182134345929899510000000000
इस पोस्ट के बाकी विवरण प्रदान करता है, एक कार्यशील कार्यान्वयन (में R
) प्रस्तुत करता है , और प्रश्न और समाधान की दक्षता के बारे में कुछ टिप्पणियों के साथ निष्कर्ष निकालता है।
एक डेक के यादृच्छिक फेरबदल उत्पन्न करना
यह वास्तव में धारणात्मक स्पष्ट और कोई और अधिक एक "डेक" विचार करने के लिए गणितीय जटिल है (उर्फ मल्टीसेट ) के कार्ड जिनमें से देखते हैं सबसे कम मूल्य वर्ग के, अगली न्यूनतम की, और इतने पर । (जैसा कि सवाल पूछा गया है कि ट्रैक्टर द्वारा निर्धारित डेक ।)N=k1+k2+⋯+kmk1k213(4,4,…,4)
कार्ड का एक "यादृच्छिक फेरबदल" एक क्रमचय है जो समान रूप से और यादृच्छिक रूप से से लिया जाता है कार्ड की की जाती है । ये शफ़ल क्योंकि permuting बराबर विन्यास के समूहों में गिर आपस में "इक्के" कुछ भी नहीं बदलता है, permuting आपस में "दुक्की" भी कुछ भी नहीं बदलता है, और इतने पर। इसलिए प्रत्येक समूह के क्रमपरिवर्तन जो कार्ड के सूटों को नजरअंदाज किए जाने पर समान दिखते हैं,क्रमपरिवर्तन। ये समूह, जिनकी संख्या इसलिए बहुराष्ट्रीय गुणांक द्वारा दी गई हैNN!=N×(N−1)×⋯×2×1Nk1k2k1!×k2!×⋯×km!
(Nk1,k2,…,km)=N!k1!k2!⋯km!,
डेक के "संयोजन" कहलाते हैं।
संयोजनों की गणना करने का एक और तरीका है। पहले कार्ड केवल संयोजन। वे अपने बीच और उसके आसपास "स्लॉट" हैं जिसमें अगले कार्ड रखे जा सकते हैं। हम इसे एक आरेख के साथ इंगित कर सकते हैं जहां " " कार्डों में से एक को नामित करता है और " " एक स्लॉट को डिजाइन करता है जो और अतिरिक्त कार्ड के बीच पकड़ कर सकता है :k1k1!/k1!=1k1+1k2∗k1_0k2
_∗_∗_⋯_∗_k1 stars
जब अतिरिक्त कार्ड होते हैं, तो सितारों का पैटर्न और नए कार्ड दो में कार्ड को विभाजित करते हैं। इस तरह के सबसे उपसमुच्चय की संख्या ।k2k1+k2(k1+k2k1,k2)=(k1+k2)!k1!k2!
इस प्रक्रिया को "threes" के साथ , हम पाते हैं कि पहले कार्डों के बीच उन्हें तरीके । इसलिए इस तरह से पहले कार्ड की व्यवस्था करने के लिए अलग-अलग तरीकों की कुल संख्या बराबर होती है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)
स्थान की प्रक्रिया
प्रारंभ में, इक्के हैं और जाहिर है कि बहुत पहले चिह्नित किया गया है। बाद के चरणों में कार्ड, जगह (यदि एक चिह्नित कार्ड मौजूद है) ( माध्यम से से कुछ मूल्य ) के बराबर है , और हम को इंटरसेप्ट करने वाले हैं उनके चारों ओर कार्ड। हम इसे एक आरेख की तरह देख सकते हैंk1 p 1 n k = k jn=k1+k2+⋯+kj−1p1nk=kj
_∗_∗_⋯_∗_p−1 stars⊙_∗_⋯_∗_n−p stars
जहां " " वर्तमान में चिह्नित प्रतीक को नामित करता है। स्थान इस मूल्य पर सशर्त , हम इस संभावना को खोजना चाहते हैं कि अगली जगह बराबर होगी ( माध्यम से से कुछ मूल्य , खेल के नियमों के अनुसार, अगली जगह बाद आनी चाहिए , जहाँ _ )। यदि हम यह पता लगा सकते हैं कि नए कार्ड को खाली करने के लिए कितने तरीके हैं , ताकि अगली जगह बराबर हो जाए , तो हम इन कार्डों को के तरीकों की कुल संख्या से विभाजित कर सकते हैं ( बराबर , जैसा कि हमने देखा है) प्राप्त करने के लिए⊙pq1n+kpq≥p+1kq(n+kk)संक्रमण संभावना है कि जगह से । (जगह के लिए पूरी तरह से गायब होने के लिए एक संक्रमण संभावना भी होगी जब कोई भी नया कार्ड चिह्नित कार्ड का पालन नहीं करता है, लेकिन इसे स्पष्ट रूप से गणना करने की कोई आवश्यकता नहीं है।)pq
आइए इस स्थिति को दर्शाने के लिए आरेख को अपडेट करें:
_∗_∗_⋯_∗_p−1 stars⊙∗∗⋯∗s stars | _∗_⋯_∗_n−p−s stars
वर्टिकल बार " " दिखाता है कि चिह्नित कार्ड के बाद पहला नया कार्ड कहां होता है: इसलिए कोई नया कार्ड इसलिए और बीच प्रकट नहीं हो सकता (और इसलिए उस अंतराल में कोई स्लॉट नहीं दिखाया गया है)। हम नहीं जानते कि इस अंतराल में कितने तारे हैं, इसलिए मैंने अभी इसे कहा है (जो कि शून्य हो सकता है) अज्ञात गायब हो जाएगा जब हम इसके और बीच संबंध खोज लेंगे ।|⊙|ssq
मान लीजिए, फिर, हम बिखेरना सितारों के आसपास नए कार्ड से पहले और then-- की है कि स्वतंत्र रूप से --we शेष बिखेरना के बाद सितारों के आसपास नए कार्ड । वहांj⊙k−j−1|
τn,k(s,p)=((p−1)+jj)((n−p−s)+(k−j)−1k−j−1)
इसे करने के तरीके। सूचना है, हालांकि - इस विश्लेषण के trickiest हिस्सा है - कि के स्थान पर के बराबर होती है क्योंकि|p+s+j+1
- कर रहे हैं पर या निशान से पहले "पुराने" कार्ड।p
- हैं चिह्न के बाद लेकिन इससे पहले वर्ष कार्ड ।s|
- हैं निशान से पहले नए कार्ड।j
- एक नया कार्ड है जिसका प्रतिनिधित्व स्वयं करता है।|
इस प्रकार, हमें स्थान से स्थान के संक्रमण के बारे में जानकारी देता है । हम के सभी संभव मूल्यों के लिए ध्यान से इस जानकारी को ट्रैक करती है , और योग इन सभी (संबंध तोड़ना) संभावनाओं में, हम जगह की सशर्त संभावना प्राप्त जगह निम्नलिखित ,p q = p + s + j + 1 s q pτ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
एल्गोरिथ्म
प्रारंभ में संभावना कि स्थान होगा और संभाव्यता यह में कोई अन्य संभावित मूल्य । यह एक वेक्टर द्वारा दर्शाया जा सकता है ।1102,3,…,k1p1=(1,0,…,0)
अगले कार्डों को बाद , वेक्टर को संक्रमण मैट्रिक्स से गुणा करके (बाईं ओर) में अपडेट किया है। । यह तब तक दोहराया जाता है जब तक सभी कार्ड नहीं डाल दिए जाते। प्रत्येक चरण में, प्रायिकता वेक्टर में प्रविष्टियों का योग मौका है कि कुछ कार्ड को चिह्नित किया गया है। जो भी मूल्य बराबर करने के लिए रहता है इसलिए यह मौका है कि कोई भी कार्ड चरण के बाद चिह्नित न होk2p1p2(Prk1,k2(q|p),1≤p≤k1,1≤q≤k2)k1+k2+⋯+kmjpj1j। इन मूल्यों में क्रमिक अंतर इसलिए हमें संभावना देते हैं कि हम टाइप का एक कार्ड नहीं खोज सकते हैं : यह उस कार्ड के मूल्य की संभावना वितरण है जिसे हम खेल के अंत में डेक से बाहर निकलने के लिए देख रहे थे। ।j
कार्यान्वयन
निम्न 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)
}
अब हम आसानी से किसी भी डेक के लिए प्रत्येक चरण में गैर-मार्क संभावनाओं की गणना कर सकते हैं:
#
# `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)
}
यहाँ वे मानक डेक के लिए हैं:
k <- rep(4, 13)
names(k) <- c("A", 2:9, "T", "J", "Q", "K")
(g <- game(k))
आउटपुट है
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
(मोंटे-कार्लो अनुकरण का वर्णन करने वाले एक अलग उत्तर में रिपोर्ट में इस आउटपुट की तुलना करें: वे यादृच्छिक भिन्नता की अपेक्षित मात्रा तक समान दिखाई देते हैं।)
अपेक्षित मूल्य तत्काल है:
> sum(diff(g) * 2:13)
[1] 5.832589
सभी ने बताया, इसके लिए केवल एक दर्जन लाइनें या निष्पादन योग्य कोड की आवश्यकता थी। मैंने इसे छोटे मूल्यों ( ) के लिए हाथ की गणना के खिलाफ जाँच की है । इस प्रकार, यदि कोड और समस्या के पूर्ववर्ती विश्लेषण के बीच कोई विसंगति स्पष्ट हो जाती है, तो कोड पर भरोसा करें (क्योंकि विश्लेषण में टाइपोग्राफिकल त्रुटियां हो सकती हैं)।k3
टिप्पणियों
अन्य दृश्यों के लिए संबंध
जब प्रत्येक कार्ड में से एक होता है, तो वितरण पूरे संख्याओं के पारस्परिक का एक क्रम होता है:
> 1/diff(game(rep(1,10)))
[1] 2 3 8 30 144 840 5760 45360 403200
जगह पर मूल्य है(जगह पर शुरू )। यह पूर्णांक अनुक्रमों के ऑनलाइन विश्वकोश में A001048 अनुक्रम है। तदनुसार, हम निरंतर ("अनुकूल" डेक) के साथ डेक के लिए एक बंद सूत्र के लिए उम्मीद कर सकते हैं जो इस अनुक्रम को सामान्य करेगा, जिसमें स्वयं कुछ गहरा अर्थ है। (उदाहरण के लिए, यह क्रमपरिवर्तन समूहों में सबसे बड़े संयुग्मन वर्गों के आकार को गिनता है और ट्रिनोमियल गुणांक से संबंधित भी है ।) (दुर्भाग्य से, लिए सामान्यीकरण में पारस्परिकता आमतौर पर पूर्णांक नहीं हैं।)ii!+(i−1)!i=1kik>1
एक स्टोकेस्टिक प्रक्रिया के रूप में खेल
हमारे विश्लेषण से यह स्पष्ट होता है कि वैक्टरों के प्रारंभिक गुणांक , , स्थिर हैं। उदाहरण के लिए, आइए इसके आउटपुट को ट्रैक करें क्योंकि यह कार्ड के प्रत्येक समूह को संसाधित करता है: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
उदाहरण के लिए, अंतिम वेक्टर का दूसरा मान (52 कार्ड के पूर्ण डेक के साथ परिणामों का वर्णन) दूसरे समूह के संसाधित होने के बाद पहले से ही दिखाई दिया (और बराबर है । इस प्रकार, यदि आप केवल कार्ड के मूल्य के बारे में जानकारी चाहते हैं , तो आपको केवल कार्ड के डेक के लिए गणना ।1/(84)=1/70jthk1+k2+⋯+kj
क्योंकि मूल्य का एक कार्ड अंकन नहीं की संभावना जल्दी से के करीब हो रही है के रूप में बढ़ जाती है, के बाद चार सूट में कार्ड के प्रकार हम लगभग उम्मीद के लिए एक सीमित मूल्य पर पहुँच गए हैं। दरअसल, सीमित मान लगभग ( कार्ड के एक डेक के लिए गणना की जाती है , जिस बिंदु पर डबल सटीक गोलाई त्रुटि किसी भी आगे जाने से रोकती है)।j1j135.8333554×32
समय
-vector पर लागू किए गए एल्गोरिदम को देखते हुए, हम देखते हैं कि इसकी समयावधि समानुपाती होनी चाहिए और - एक कच्चे ऊपरी बाउंड का उपयोग करना - आनुपातिक से कोई भी बदतर नहीं। । के लिए और माध्यम से तक सभी गणनाओं का समय निर्धारित करके , और केवल अपेक्षाकृत लंबे समय ( सेकंड या उससे अधिक) लेने वाले लोगों का विश्लेषण करके , मैं अनुमान लगाता हूं कि गणना समय लगभग , इस ऊपरी-सीमा मूल्यांकन का समर्थन करता है।( k , k , … , k ) k 2 m 3 k = १ 10 n = १० ३० १ / २ O ( k २ n २.९ ३ )m(k,k,…,k)k2m3k=17n=10301/2O(k2n2.9)
इन एसिम्पटोटिक्स का एक उपयोग बड़ी समस्याओं के लिए गणना समय को प्रोजेक्ट करना है। उदाहरण के लिए, यह देखते हुए कि केस में लगभग सेकंड लगते हैं , हम अनुमान लगाएंगे कि (बहुत ही दिलचस्प) केस लगभग सेकंड। (यह वास्तव में सेकंड लेता है ।)k=4,n=30कश्मीर = 1 , n = 100 1.31 ( 1 / 4 ) 2 ( 100 / 30 ) 2.9 ≈ 2.7 2.871.31k=1,n=1001.31(1/4)2(100/30)2.9≈2.72.87