Saya mengalami beberapa masalah dalam menyelesaikan yang berikut ini.
Anda mengambil kartu dari tumpukan kartu 52 kartu standar tanpa penggantian sampai Anda mendapatkan kartu As. Anda menarik dari apa yang tersisa sampai Anda mendapatkan 2. Anda melanjutkan dengan 3. Berapa angka yang diharapkan Anda akan berada setelah seluruh dek habis?
Wajar membiarkannya
Jadi masalah pada dasarnya sama dengan mencari tahu probabilitas bahwa Anda akan berada di ketika dek habis, yaitu:
Saya bisa melihatnya
tetapi tidak bisa melangkah lebih jauh ...
2AAA2
Jawaban:
mengikuti ide @ gung, saya percaya nilai yang diharapkan adalah 5,84? dan dari interpretasi saya tentang komentar, saya berasumsi "A" adalah nilai yang hampir mustahil (kecuali empat kartu terakhir di geladak adalah kartu As). berikut adalah hasil dari iterasi 100.000 simulasi monte carlo
dan inilah kode R jika Anda ingin bermain dengannya ..
sumber
A
mungkin? Pertimbangkan urutan 48 kartu yang diikuti olehAAAA
misalnya.1/prod( 48:1 / 52:5 )
results
Untuk simulasi, sangat penting untuk menjadi benar dan cepat. Kedua tujuan ini menyarankan penulisan kode yang menargetkan kemampuan inti dari lingkungan pemrograman serta kode yang sesingkat dan sesederhana mungkin, karena kesederhanaan memberikan kejelasan dan kejelasan mempromosikan kebenaran. Inilah usaha saya untuk mencapai keduanya di
R
:Menerapkan ini dengan cara yang dapat direproduksi dapat dilakukan dengan
replicate
fungsi setelah mengatur seed number acak, seperti padaItu lambat, tetapi cukup cepat untuk melakukan simulasi yang cukup panjang (dan karenanya tepat) berulang kali tanpa menunggu. Ada beberapa cara untuk menunjukkan hasilnya. Mari kita mulai dengan artinya:
Yang terakhir adalah kesalahan standar: kami berharap rata-rata yang disimulasikan berada dalam dua atau tiga SE dari nilai sebenarnya. Itu menempatkan harapan sebenarnya di suatu tempat antara dan5.8535.817 5.853 .
Kami juga mungkin ingin melihat tabulasi frekuensi (dan mereka kesalahan standar). Kode berikut sedikit memberi sedikit tabulasi:
Berikut hasilnya:
Bagaimana kita tahu simulasi itu benar? Salah satu caranya adalah mengujinya secara mendalam untuk masalah yang lebih kecil. Untuk alasan itu kode ini ditulis untuk menyerang generalisasi kecil dari masalah, mengganti kartu yang berbeda dengan dan kartu dengan . Namun, untuk pengujian penting untuk dapat memberi makan kode dek dalam urutan yang telah ditentukan. Mari kita tulis antarmuka yang sedikit berbeda dengan algoritma yang sama:413 4
n
k
(Dimungkinkan untuk digunakan
draw
disim
mana - mana, tetapi kerja ekstra yang dilakukan di awaldraw
membuatnya dua kali lebih lambatsim
.)Kita dapat menggunakan ini dengan menerapkannya pada setiap pengocokan berbeda dari dek yang diberikan. Karena tujuan di sini hanya beberapa tes satu kali, efisiensi dalam menghasilkan shuffles tidak penting. Berikut ini cara kasar yang cepat:
Sekarang
d
adalah bingkai data yang barisnya berisi semua shuffles. Terapkandraw
ke setiap baris dan hitung hasilnya:Output (yang akan kita gunakan dalam tes formal sebentar lagi) adalah
(Nilai mudah dimengerti, ngomong-ngomong: kita masih akan mengerjakan kartu jika dan hanya jika semua pasangan mendahului semua kartu As. Peluang terjadinya ini (dengan dua setelan) adalah . Dari berbeda, miliki properti ini.)2 1 / ( 2 + 2420 2 25202520/6=4201/(2+22)=1/6 2520 2520/6=420
Kami dapat menguji output dengan uji chi-squared. Untuk tujuan ini saya menerapkan kali untuk kasus ini kartu berbeda dalam :10,000 n=4 k=2
sim
n = 4 k = 2Karena sangat tinggi, kami tidak menemukan perbedaan yang signifikan antara apa yang dikatakan dan nilai-nilai yang dihitung oleh enumerasi lengkap. Mengulangi latihan ini untuk beberapa nilai dan lainnya (kecil) menghasilkan hasil yang sebanding, memberi kami banyak alasan untuk percaya ketika diterapkan pada dan .n k n = 13 k = 4p n k n=13 k=4
sim
sim
Akhirnya, uji chi-kuadrat dua sampel akan membandingkan keluaran
sim
ke keluaran yang dilaporkan dalam jawaban lain:Statistik chi-squared yang sangat besar menghasilkan nilai-p yang pada dasarnya nol: tanpa keraguan,
sim
tidak setuju dengan jawaban lainnya. Ada dua kemungkinan resolusi perselisihan: satu (atau keduanya!) Jawaban ini salah atau mereka menerapkan interpretasi yang berbeda dari pertanyaan tersebut. Sebagai contoh, saya telah menafsirkan "setelah dek habis" berarti setelah mengamati kartu terakhir dan, jika diperbolehkan, memperbarui "nomor Anda akan berada di" sebelum mengakhiri prosedur. Dapat dibayangkan bahwa langkah terakhir tidak dimaksudkan untuk diambil. Mungkin beberapa perbedaan penafsiran yang halus seperti itu akan menjelaskan ketidaksepakatan, pada titik mana kita dapat memodifikasi pertanyaan untuk memperjelas apa yang ditanyakan.sumber
Ada jawaban yang tepat (dalam bentuk produk matriks, disajikan pada poin 4 di bawah). Algoritma yang cukup efisien untuk menghitungnya ada, berasal dari pengamatan ini:
Acak acak kartu dapat dihasilkan dengan mengocok kartu secara acak dan kemudian secara acak memotong kartu tersisa di dalamnya.N kN+k N k
Dengan hanya mengocok kartu As, dan kemudian (menerapkan pengamatan pertama) menyelingi keduanya, lalu bertiga, dan seterusnya, masalah ini dapat dilihat sebagai rantai dari tiga belas langkah.
Kita perlu melacak lebih dari nilai kartu yang kita cari. Ketika melakukan ini, kita tidak perlu memperhitungkan posisi tanda relatif terhadap semua kartu, tetapi hanya posisinya relatif terhadap kartu yang nilainya sama atau lebih kecil.
Bayangkan menempatkan tanda pada kartu as pertama, dan kemudian menandai dua yang pertama ditemukan setelahnya, dan seterusnya. (Jika pada suatu tahap dek habis tanpa menampilkan kartu yang sedang kami cari, kami akan membiarkan semua kartu tidak ditandai.) Biarkan "tempat" dari setiap tanda (bila ada) adalah jumlah kartu dengan nilai yang sama atau lebih rendah yang dibagikan ketika tanda dibuat (termasuk kartu yang ditandai itu sendiri). Tempat-tempat berisi semua informasi penting.
Tempat setelah tanda dibuat adalah angka acak. Untuk dek tertentu, urutan tempat-tempat ini membentuk proses stokastik. Ini sebenarnya adalah proses Markov (dengan matriks transisi variabel). Karena itu jawaban yang tepat dapat dihitung dari dua belas perkalian matriks.ith
Menggunakan ide-ide ini, mesin ini memperoleh nilai (komputasi dalam floating point presisi ganda) dalam detik. Perkiraan nilai persis ini akurat untuk semua digit yang ditampilkan.1 / 9 19826005792658947850269453319689390235225425695.8325885529019965 1/9
Sisa dari posting ini memberikan perincian, menyajikan implementasi kerja (dalam
R
), dan diakhiri dengan beberapa komentar tentang pertanyaan dan efisiensi solusi.Menghasilkan serutan acak dari sebuah geladak
Sebenarnya lebih jelas secara konseptual dan tidak lebih rumit secara matematis untuk mempertimbangkan "dek" (alias multiset ) dari kartu yang ada dari denominasi terendah, dari terendah berikutnya, dan seterusnya . (Pertanyaan yang diajukan menyangkut dek yang ditentukan oleh vektor- .)N=k1+k2+⋯+km k1 k2 13 (4,4,…,4)
A "acak acak" kartu adalah satu permutasi diambil secara seragam dan acak dari permutasi kartuShuffles ini jatuh ke dalam kelompok konfigurasi yang setara karena "ace" antara mereka sendiri tidak mengubah apa pun, "dua" antara mereka sendiri juga tidak mengubah apa pun, dan sebagainya. Oleh karena itu setiap kelompok permutasi yang terlihat identik ketika kartu-kartu tersebut diabaikan berisipermutasi. Kelompok-kelompok ini, yang jumlahnya diberikan oleh koefisien multinomialN N!=N×(N−1)×⋯×2×1 N k1 k2 k1!×k2!×⋯×km!
disebut "kombinasi" dari dek.
Ada cara lain untuk menghitung kombinasi. Kartu pertama dapat membentuk kombinasi. Mereka meninggalkan "slot" di antara dan di sekelilingnya tempat kartu berikutnya dapat ditempatkan. Kami dapat menunjukkan ini dengan diagram di mana " " menunjuk salah satu kartu dan " " menunjuk sebuah slot yang dapat menampung antara dan kartu tambahan:k1 k1!/k1!=1 k1+1 k2 ∗ k1 _ 0 k2
Ketika kartu tambahan diselingi, pola bintang dan kartu baru kartu menjadi dua subset. Jumlah himpunan bagian yang berbeda adalah .k2 k1+k2 (k1+k2k1,k2)=(k1+k2)!k1!k2!
Mengulangi prosedur ini dengan "bertiga," kami menemukan ada cara untuk menyelinginya di antara kartu pertama . Karenanya jumlah total cara berbeda untuk mengatur kartu dengan cara ini sama dengank3 ((k1+k2)+k3k1+k2,k3)=(k1+k2+k3)!(k1+k2)!k3! k1+k2 k1+k2+k3
Setelah menyelesaikan kartu terakhir dan terus melipatgandakan fraksi teleskop ini, kami menemukan bahwa jumlah kombinasi berbeda yang diperoleh sama dengan jumlah total kombinasi yang dihitung sebelumnya, . Karenanya, kami tidak mengabaikan kombinasi. Itu berarti proses berurutan mengocok kartu dengan benar menangkap probabilitas setiap kombinasi, dengan asumsi bahwa pada setiap tahap, setiap cara yang mungkin berbeda untuk menyelingi kartu-kartu baru di antara kartu yang lama diambil dengan probabilitas yang sama merata.kn (Nk1,k2,…,km)
Proses tempat
Awalnya, ada ace dan jelas yang pertama ditandai. Pada tahap selanjutnya ada , tempatnya (jika kartu yang ditandai ada) sama dengan (beberapa nilai dari hingga ), dan kami akan menyelingi kartu sekitar mereka. Kita dapat memvisualisasikan ini dengan diagram sepertik1 n=k1+k2+⋯+kj−1 p 1 n k=kj
di mana " " menunjukkan simbol yang saat ini ditandai. Bersyarat pada nilai tempat , kami ingin menemukan probabilitas bahwa tempat berikutnya akan sama dengan (beberapa nilai dari hingga ; menurut aturan permainan, tempat berikutnya harus datang setelah , dari mana ). Jika kita dapat menemukan berapa banyak cara yang ada untuk menyelingi kartu baru di tempat kosong sehingga tempat berikutnya sama dengan , maka kita dapat membagi dengan jumlah total cara untuk menyelingi kartu-kartu ini (sama dengan , seperti yang telah kita lihat) untuk mendapatkan⊙ p q 1 n+k p q≥p+1 k q (n+kk) probabilitas transisi bahwa tempat berubah dari ke . (Akan ada juga kemungkinan transisi untuk tempat tersebut hilang sama sekali ketika tidak ada kartu baru yang mengikuti kartu yang ditandai, tetapi tidak perlu menghitung ini secara eksplisit.)p q
Mari kita perbarui diagram untuk mencerminkan situasi ini:
Bilah vertikal " " menunjukkan di mana kartu baru pertama muncul setelah kartu yang ditandai: karena itu tidak ada kartu baru yang muncul di antara dan (dan karenanya tidak ada slot yang ditampilkan dalam interval itu). Kita tidak tahu berapa banyak bintang dalam interval ini, jadi saya baru saja menyebutnya (yang mungkin nol) tidak diketahui akan hilang begitu kita menemukan hubungan antara itu dan .| ⊙ | s s q
Misalkan, kemudian, kami menyelingi kartu baru di sekitar bintang sebelum dan then-- secara independen dari yang --Kami menyelingi sisa kartu baru di sekitar bintang setelah . Adaj ⊙ k−j−1 |
cara untuk melakukan ini. Perhatikan, meskipun - ini adalah bagian tersulit dari analisis - bahwa tempat sama dengan karena| p+s+j+1
Dengan demikian, memberi kami informasi tentang transisi dari tempat ke tempat . Ketika kami melacak informasi ini dengan cermat untuk semua nilai yang mungkin dari , dan menjumlahkan semua kemungkinan (terpisah) ini, kami memperoleh probabilitas bersyarat tempat berikut tempat ,τn,k(s,p) p q=p+s+j+1 s q p
di mana jumlah dimulai pada dan berakhir pada . (Panjang variabel dari jumlah ini menunjukkan ada tidak mungkin menjadi formula tertutup untuk itu sebagai fungsi dari dan , kecuali dalam kasus khusus.)j=max(0,q−(n+1)) j=min(k−1,q−(p+1) n,k,q, p
Algoritma
Awalnya ada probabilitas bahwa tempat itu akan menjadi dan probabilitas itu akan memiliki nilai lain yang mungkin dalam . Ini dapat diwakili oleh vektor .1 1 0 2,3,…,k1 p1=(1,0,…,0)
Setelah kartu berikutnya , vektor diperbarui ke dengan mengalikannya (di sebelah kiri) dengan matriks transisi . Ini diulangi sampai semua telah ditempatkan. Pada setiap tahap , jumlah entri dalam vektor probabilitas adalah kemungkinan beberapa kartu telah ditandai. Apa pun yang tersisa untuk membuat nilai sama dengan oleh karena itu adalah kesempatan bahwa tidak ada kartu yang ditandai setelah langkahk2 p1 p2 (Prk1,k2(q|p),1≤p≤k1,1≤q≤k2) k1+k2+⋯+km j pj 1 j . Perbedaan berturut-turut dalam nilai-nilai ini karena itu memberi kita probabilitas bahwa kita tidak dapat menemukan kartu tipe untuk ditandai: yaitu distribusi probabilitas dari nilai kartu yang kita cari ketika tumpukan kartu habis di akhir permainan. .j
Penerapan
R
Kode berikut mengimplementasikan algoritma. Ini sejajar dengan diskusi sebelumnya. Pertama, perhitungan probabilitas transisi dilakukan oleht.matrix
(tanpa normalisasi dengan pembagian dengan , membuatnya lebih mudah untuk melacak perhitungan saat menguji kode):Ini digunakanpj−1 pj p1
transition
untuk memperbarui ke . Ini menghitung matriks transisi dan melakukan perkalian. Ia juga menangani perhitungan vektor awal jika argumennya adalah vektor kosong:p
Kita sekarang dapat dengan mudah menghitung probabilitas non-mark pada setiap tahap untuk setiap dek:
Ini untuk dek standar:
Outputnya adalah
Menurut aturan, jika seorang raja ditandai maka kita tidak akan mencari kartu lebih lanjut: ini berarti nilai harus ditingkatkan menjadi . Setelah melakukan itu, perbedaannya memberikan distribusi "nomor Anda akan ketika dek habis":0.9994461 1
(Bandingkan ini dengan keluaran yang saya laporkan dalam jawaban terpisah yang menggambarkan simulasi Monte-Carlo: semuanya tampak sama, hingga jumlah variasi acak yang diharapkan.)
Nilai yang diharapkan segera:
Semua mengatakan, ini membutuhkan hanya selusin baris kode yang dapat dieksekusi. Saya telah memeriksanya dengan perhitungan tangan untuk nilai kecil (hingga ). Dengan demikian, jika ada perbedaan antara kode dan analisis masalah sebelumnya, percayakan kode tersebut (karena analisis tersebut mungkin memiliki kesalahan ketik).k 3
Catatan
Hubungan dengan urutan lainnya
Ketika ada satu kartu masing-masing, distribusi adalah urutan kebalikan dari seluruh angka:
Nilai di tempat adalah(mulai dari tempat ). Ini adalah urutan A001048 dalam Ensiklopedia Online Urutan Bilangan Bulat. Dengan demikian, kita mungkin berharap untuk formula tertutup untuk deck dengan konstan (deck "cocok") yang akan menggeneralisasi urutan ini, yang dengan sendirinya memiliki beberapa makna mendalam. (Misalnya, ia menghitung ukuran kelas konjugasi terbesar dalam kelompok permutasi dan juga terkait dengan koefisien trinomial .) (Sayangnya, timbal balik dalam generalisasi untuk biasanya tidak bilangan bulat.)i i!+(i−1)! i=1 ki k>1
Permainan sebagai proses stokastik
Analisis kami memperjelas bahwa koefisien awal vektor , , adalah konstan. Misalnya, mari kita lacak output saat memproses setiap kelompok kartu:i pj j≥i
game
...
Sebagai contoh, nilai kedua dari vektor final (menggambarkan hasil dengan setumpuk penuh 52 kartu) sudah muncul setelah kelompok kedua diproses (dan sama dengan ). Dengan demikian, jika Anda menginginkan informasi hanya tentang tanda naik melalui nilai kartu , Anda hanya perlu melakukan perhitungan untuk setumpuk kartu .1/(84)=1/70 jth k1+k2+⋯+kj
Karena peluang untuk tidak menandai kartu nilai semakin cepat mendekati ketika meningkat, setelah jenis kartu dalam empat setelan, kita hampir mencapai nilai pembatas untuk ekspektasi. Memang, nilai pembatas sekitar (dihitung untuk setumpuk kartu , di mana titik kesalahan pembulatan presisi ganda mencegah melangkah lebih jauh).j 1 j 13 5.833355 4×32
Pengaturan waktu
Melihat algoritma yang diterapkan pada vektor- , kami melihat waktunya harus proporsional dengan dan - menggunakan batas atas mentah - tidak lebih buruk daripada proporsional dengan . Dengan menghitung semua perhitungan untuk hingga dan hingga , dan menganalisis hanya mereka yang mengambil waktu yang relatif lama ( detik atau lebih lama), saya memperkirakan waktu perhitungan sekitar , mendukung penilaian batas atas ini.( k , k , ... , k ) k 2 m 3 k = 1 7 n = 10 30 1 / 2 O ( k 2 n 2,9 )m (k,k,…,k) k2 m3 k=1 7 n=10 30 1/2 O(k2n2.9)
Salah satu penggunaan asimptotik ini adalah memproyeksikan waktu perhitungan untuk masalah yang lebih besar. Sebagai contoh, melihat bahwa kasus membutuhkan waktu sekitar detik, kami akan memperkirakan bahwa kasus (sangat menarik) akan memakan waktu sekitar detik. (Sebenarnya butuh detik.)1.31 k = 1 , n = 100 1,31 ( 1 / 4 ) 2 ( 100 / 30 ) 2,9 ≈ 2,7 2,87k=4,n=30 1.31 k=1,n=100 1.31(1/4)2(100/30)2.9≈2.7 2.87
sumber
Meretas Monte Carlo sederhana di Perl dan menemukan sekitar .5.8329
sumber