มีคำตอบที่แน่นอน (ในรูปแบบของผลิตภัณฑ์เมทริกซ์, นำเสนอในจุดที่ 4 ด้านล่าง) อัลกอริธึมที่มีประสิทธิภาพพอสมควรในการคำนวณมันเกิดขึ้นจากการสังเกตเหล่านี้:
การสุ่มแบบสุ่มของการ์ดสามารถสร้างขึ้นได้โดยการสุ่มไพ่แบบแล้วทำการสุ่มแยกไพ่ที่เหลือภายในสุ่มN kN+kNk
ด้วยการสับเอซเพียงอย่างเดียวจากนั้น (ใช้การสังเกตครั้งแรก) สลับกับ twos จากนั้นทั้งสามและต่อ ๆ ไปปัญหานี้สามารถมองได้ว่าเป็นโซ่สิบสามขั้น
เราจำเป็นต้องติดตามมากกว่ามูลค่าของการ์ดที่เรากำลังค้นหา อย่างไรก็ตามในการทำเช่นนี้เราไม่จำเป็นต้องคำนึงถึงตำแหน่งของเครื่องหมายที่สัมพันธ์กับการ์ดทั้งหมดแต่จะมีเฉพาะตำแหน่งที่สัมพันธ์กับการ์ดที่มีค่าเท่ากันหรือเล็กกว่า
ลองนึกภาพวางเครื่องหมายบนเอซตัวแรกแล้วทำเครื่องหมายสองอันแรกที่พบหลังจากนั้นเป็นต้น (หากในขั้นตอนใด ๆ ที่เด็คหมดโดยไม่ต้องแสดงการ์ดที่เรากำลังค้นหาเราจะปล่อยการ์ดทั้งหมดที่ไม่มีเครื่องหมาย) ให้ "สถานที่" ของเครื่องหมายแต่ละอัน (เมื่อมีอยู่) เป็นจำนวนไพ่ที่มีค่าเท่ากันหรือต่ำกว่า ถูกแจกเมื่อทำเครื่องหมาย (รวมถึงการ์ดที่ทำเครื่องหมายด้วยตัวเอง) สถานที่มีข้อมูลที่จำเป็นทั้งหมด
สถานที่หลังเครื่องหมายถูกสร้างขึ้นเป็นหมายเลขสุ่ม สำหรับสำรับที่กำหนดลำดับของสถานที่เหล่านี้ในรูปแบบกระบวนการสุ่ม อันที่จริงแล้วมันเป็นกระบวนการของมาร์คอฟ (พร้อมเมทริกซ์การเปลี่ยนแปลงตัวแปร) คำตอบที่แน่นอนสามารถคำนวณได้จากการคูณเมทริกซ์ที่สิบสองith
การใช้แนวคิดเหล่านี้เครื่องนี้จะได้รับค่า (คำนวณในทศนิยมความแม่นยำสองเท่า) ในวินาที การประมาณค่าที่แน่นอนนี้ตัวเลขทุกตัวที่แสดงนั้นถูกต้อง1 / 9 19826005792658947850269453319689390235225425695.83258855290199651/9
1982600579265894785026945331968939023522542569339917784579447928182134345929899510000000000
ส่วนที่เหลือของโพสต์นี้ให้รายละเอียดนำเสนอการดำเนินงาน (ในR
) และสรุปความคิดเห็นเกี่ยวกับคำถามและประสิทธิภาพของการแก้ปัญหา
การสร้างสับแบบสุ่มของสำรับ
จริง ๆ แล้วมันเป็นแนวคิดที่ชัดเจนและไม่มีความซับซ้อนทางคณิตศาสตร์มากนักในการพิจารณา "เด็ค" (aka multiset ) ของการ์ดซึ่งมีของนิกายที่ต่ำที่สุดของที่ต่ำที่สุดถัดไปและอื่น ๆ . (คำถามที่ถามเป็นความกังวลดาดฟ้ากำหนดโดยเวกเตอร์ .)k 1 k 2 13 ( 4 , 4 , … , 4 )N=k1+k2+⋯+kmk1k213(4,4,…,4)
"สุ่มสุ่ม" ของการ์ดคือการเปลี่ยนรูปแบบหนึ่งครั้งที่สม่ำเสมอและสุ่มจากการเรียงสับเปลี่ยนของการ์ดshuffles เหล่านี้จัดอยู่ในกลุ่มของการกำหนดค่าที่เทียบเท่ากันเพราะการ "เอซ" ในหมู่พวกเขาไม่มีอะไรเปลี่ยนแปลงการ "twos" ในหมู่พวกเขาเองก็ไม่มีอะไรเปลี่ยนแปลงเช่นกัน ดังนั้นการเรียงสับเปลี่ยนแต่ละกลุ่มที่มีลักษณะเหมือนกันเมื่อชุดไพ่ถูกละเว้นจะมีพีชคณิต กลุ่มเหล่านี้ที่มีจำนวนจึงถูกกำหนดโดยสัมประสิทธิ์พหุนามNN!=N×(N−1)×⋯×2×1Nk1k2k1!×k2!×⋯×km!
(Nk1,k2,…,km)=N!k1!k2!⋯km!,
เรียกว่า "ชุด" ของสำรับ
มีอีกวิธีในการนับชุดค่าผสม การ์ดแรกสามารถสร้างได้เพียงชุดค่าผสม พวกเขาปล่อยให้ "ช่อง" ระหว่างและรอบ ๆ พวกเขาซึ่งสามารถวางการ์ดถัดไปได้ เราสามารถระบุสิ่งนี้ด้วยแผนภาพที่ " " กำหนดหนึ่งในการ์ดและ " " กำหนดช่องที่สามารถเก็บการ์ดได้ระหว่างและการ์ดเพิ่มเติม:k1k1!/k1!=1k1+1k2∗k1_0k2
_∗_∗_⋯_∗_k1 stars
เมื่อการ์ดเพิ่มเติมสลับกันรูปแบบของดาวและการ์ดใหม่จะแบ่งพาร์ติชันการ์ดออกเป็นสองชุดย่อย จำนวนย่อยดังกล่าวที่แตกต่างกันคือk_2!}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!.
หลังจากเสร็จสิ้นการสุดท้ายบัตรและต่อเนื่องในการคูณเศษส่วนเหลื่อมเหล่านี้เราพบว่าจำนวนของชุดที่แตกต่างกันได้เท่ากับจำนวนรวมของการรวมกันนับเป็นก่อนหน้านี้k_m} ดังนั้นเราไม่ได้มองข้ามชุดค่าผสม นั่นหมายถึงกระบวนการเรียงลำดับของการสับไพ่อย่างถูกต้องจะตรวจจับความน่าจะเป็นของแต่ละชุดรวมกันโดยสมมติว่าในแต่ละขั้นตอนแต่ละวิธีที่เป็นไปได้ที่แตกต่างกันในการสลับไพ่ใหม่ในกลุ่มเก่านั้นkn(Nk1,k2,…,km)
กระบวนการสถานที่
เริ่มแรกมีเอซและเห็นได้ชัดว่ามีการทำเครื่องหมายครั้งแรก ในระยะต่อมาจะมีสถานที่ (หากมีการ์ดที่ทำเครื่องหมายไว้) เท่ากับ (ค่าบางส่วนจากถึง ) และเรากำลังจะกระจายไพ่รอบตัว เราสามารถเห็นภาพนี้ด้วยแผนภาพดังนี้k1n=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
แถบแนวตั้ง " " แสดงตำแหน่งที่มีการ์ดใหม่ใบแรกเกิดขึ้นหลังจากการ์ดที่ถูกทำเครื่องหมาย: จึงไม่มีการ์ดใหม่ปรากฏขึ้นระหว่างและ (ดังนั้นจึงไม่มีช่องแสดงในช่วงเวลานั้น) เราไม่ทราบว่าหลายดาวที่มีอยู่ในช่วงเวลานี้ดังนั้นฉันได้เพียงแค่เรียกมัน (ซึ่งอาจจะเป็นศูนย์) ไม่ทราบจะหายไปเมื่อเราพบความสัมพันธ์ระหว่างมันและQ|⊙|ssq
สมมติว่าแล้วเรากระจายบัตรใหม่รอบดาวก่อนและ then-- เป็นอิสระจากที่ --we กระจายส่วนที่เหลืออีกบัตรใหม่รอบดาวฤกษ์หลังจากที่\มีj⊙k−j−1|
τn,k(s,p)=((p−1)+jj)((n−p−s)+(k−j)−1k−j−1)
วิธีในการทำเช่นนี้ โปรดสังเกตว่า - นี่คือส่วนที่ยากที่สุดของการวิเคราะห์ - ที่ของเท่ากับเพราะ|p+s+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 = min ( k - 1 , q - ( p + 1 )j=max(0,q−(n+1))j=min(k−1,q−(p+1)n,k,q,p
อัลกอริทึม
สมัยก่อนมีความน่าจะเป็นว่าสถานที่ที่จะเป็นและน่าจะเป็นมันจะมีค่าที่เป็นไปได้อื่น ๆ ในk_1 นี้สามารถแสดงโดยเวกเตอร์0)1102,3,…,k1p1=(1,0,…,0)
หลังจากสลับการ์ดถัดไปเวกเตอร์จะได้รับการอัปเดตเป็นโดยคูณ (ทางซ้าย) โดยเมทริกซ์การเปลี่ยนภาพk_2) สิ่งนี้จะทำซ้ำจนกว่าจะทั้งหมด ในขั้นตอนแต่ละผลรวมของรายการในความน่าจะเป็นเวกเตอร์เป็นโอกาสที่บางบัตรได้รับการทำเครื่องหมาย สิ่งที่ยังคงอยู่ที่จะทำให้ค่าเท่ากับดังนั้นจึงเป็นโอกาสที่ไม่มีบัตรถูกทำเครื่องหมายไว้หลังจากขั้นตอน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
การอัปเดตการp_jมันคำนวณเมทริกซ์การเปลี่ยนแปลงและดำเนินการคูณ นอกจากนี้ยังดูแลการคำนวณเวกเตอร์เริ่มต้นหากอาร์กิวเมนต์เป็นเวกเตอร์เปล่า: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
ตามกฎถ้าเป็นพระมหากษัตริย์ที่ถูกทำเครื่องหมายแล้วเราจะไม่มองหาบัตรใด ๆ เพิ่มเติม: ที่นี้หมายถึงค่าของจะต้องมีการเพิ่มขึ้นถึง1เมื่อทำเช่นนั้นความแตกต่างจะให้การกระจายของ "หมายเลขที่คุณจะได้รับเมื่อเด็คหมด":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
(เปรียบเทียบสิ่งนี้กับผลลัพธ์ที่ฉันรายงานในคำตอบแยกต่างหากที่อธิบายถึงการจำลอง Monte-Carlo: พวกเขาดูเหมือนจะเหมือนกันมากถึงความคาดหวังของการเปลี่ยนแปลงแบบสุ่ม)
มูลค่าที่คาดว่าจะได้ทันที:
> 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ในสารานุกรมออนไลน์ของลำดับจำนวนเต็ม ดังนั้นเราอาจหวังว่าสูตรปิดสำหรับเด็คที่มีค่าคงที่ ( "เหมาะ") ที่จะพูดคุยลำดับนี้ซึ่งตัวมันเองมีความหมายที่ลึกซึ้งบางอย่าง (ยกตัวอย่างเช่นมันนับขนาดของชั้นเรียน conjugacy ที่ใหญ่ที่สุดในกลุ่มการเปลี่ยนแปลงและยังเกี่ยวข้องกับค่าสัมประสิทธิ์ Trinomial .) ( แต่น่าเสียดายที่ส่วนกลับในลักษณะทั่วไปสำหรับมักจะไม่จำนวนเต็ม.)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 ม. 3 k = 1 7 n = 10 30 1 / 2 O ( k 2 n 2.9 )m(k,k,…,k)k2m3k=17n=10301/2O(k2n2.9)
การใช้งานหนึ่งใน asymptotics เหล่านี้คือการคำนวณเวลาของโครงการสำหรับปัญหาที่ใหญ่กว่า ตัวอย่างเช่นเมื่อเห็นว่ากรณีใช้เวลาประมาณวินาทีเราจะประมาณว่ากรณี (น่าสนใจมาก)จะใช้เวลาประมาณวินาที (ใช้เวลาจริงวินาที)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