Jumlah lemparan koin yang diharapkan untuk mendapatkan N berturut-turut, diberikan M berturut-turut


10

Interviewstreet memiliki CodeSprint kedua pada bulan Januari yang mencakup pertanyaan di bawah ini. Jawaban terprogram diposting tetapi tidak termasuk penjelasan statistik.

(Anda dapat melihat masalah asli dan memposting solusi dengan masuk ke situs web Interviewstreet dengan kredibilitas Google dan kemudian membuka masalah Coin Tosses dari halaman ini .)

Tosses Koin

Anda memiliki koin yang tidak bias yang ingin Anda terus lempar sampai Anda mendapatkan N kepala berturut-turut. Anda telah melemparkan koin M kali dan secara mengejutkan, semua lemparan menghasilkan kepala.

Berapa jumlah lemparan tambahan yang diharapkan yang dibutuhkan sampai Anda mendapatkan N kepala berturut-turut?

Input:
Baris pertama berisi jumlah kasus T. Masing-masing baris T berikutnya berisi dua angka N dan M.

Keluaran:
Garis T keluaran yang berisi jawaban untuk test case yang sesuai. Cetak jawaban dibulatkan hingga tepat 2 angka desimal.

Input Sampel:
4
2 0
2 1
3 3
3 2

Contoh Hasil:
6.00
4.00
0.00
8.00

Contoh Penjelasan:
Jika N = 2 dan M = 0, Anda harus terus melempar koin sampai Anda mendapatkan 2 kepala berturut-turut. Tidak sulit untuk menunjukkan bahwa rata-rata, 6 lemparan koin diperlukan.
Jika N = 2 dan M = 1, Anda perlu 2 kepala berturut-turut dan sudah memiliki 1. Anda harus melemparkan sekali lagi apa pun yang terjadi. Dalam lemparan pertama itu, jika Anda mendapatkan kepala, Anda selesai. Jika tidak, Anda harus memulai dari awal, karena penghitung ulang berurutan mereset, dan Anda harus terus melempar koin sampai Anda mendapatkan N = 2 kepala berturut-turut. Jumlah lemparan koin yang diharapkan adalah 1 + (0,5 * 0 + 0,5 * 6) = 4,0 Jika N = 3 dan M = 3, Anda sudah mendapatkan 3 kepala, jadi Anda tidak perlu lagi melemparkan.

Semua persamaan matematika yang saya buat memiliki jawaban yang tepat untuk data input sampel yang tercantum di atas, tetapi salah untuk semua set input lainnya (yang tidak diketahui). Solusi terprogram mereka tampaknya memecahkan masalah jauh berbeda dari metode coba-untuk-datang-dengan-persamaan-saya. Bisakah seseorang tolong jelaskan bagaimana menghasilkan persamaan yang akan menyelesaikan ini?


1
Lihat juga di sini di mana kami juga menemukan hasil diberikan oleh Daniel Johnson di bawah ini. 2N+12M+1
Dilip Sarwate

Jawaban:


8

Ini adalah latihan komputasi, jadi pikirkanlah secara rekursif . Keadaan membalik koin saat ini ditentukan oleh pasangan yang dipesan dengan . Biarkan jumlah flips yang diharapkan untuk mencapai head berturut-turut menjadi :(N,M)NM0Ne(N,M)

(1) Ada kemungkinan 50% flip berikutnya akan menjadi kepala, membawa Anda ke negara , dan 50% kemungkinan flip berikutnya akan menjadi ekor, membawa Anda ke negara . Ini biaya satu flip. Oleh karena itu harapan (secara rekursif) diberikan oleh(N,M+1)(N,0)

e(N,M)=12e(N,M+1)+12e(N,0)+1.

(2) Kondisi dasar: Anda telah menetapkan itu

e(N,0)=2N+12

dan jelas

e(N,N)=0

(tidak perlu membalik lagi).

Inilah program Mathematica yang sesuai (termasuk caching hasil antara untuk mempercepat rekursi, yang secara efektif menjadikannya solusi pemrograman dinamis):

e[n_, m_] /; n > m > 0 := e[n, m] = 1 + (e[n, m + 1] + e[n, 0])/2 // Simplify
e[n_, 0] := 2^(n + 1) - 2
e[n_, n_] := 0

Program akan terlihat serupa dalam bahasa pemrograman lain yang mendukung rekursi. Secara matematis, kita dapat memverifikasi bahwa hanya dengan memeriksa rekursi, karena jelas berlaku untuk kasus dasar:e(N,M)=2N+12M+1

2N+12M+1=1+(2N+12M+2+2N+12)/2,

yang berlaku untuk setiap dan , QED.MN


Secara lebih umum , pendekatan yang sama akan menetapkan bahwa ketika koin memiliki probabilitas kepala. Bagian yang sulit adalah mengusahakan kondisi dasar . Itu dilakukan dengan mengejar rekursi keluar langkah sampai akhirnya dinyatakan dalam hal itu sendiri dan menyelesaikan:e(N,M)=pNpM1ppe(N,0)Ne(N,0)

e(N,0)=1+pe(N,1)+(1p)e(n,0)=1+p(1+pe(N,2)+(1p)e(N,0))+(1p)e(N,0)=1+p+p2++pN1+(1p)[1+p++pN1]e(N,0);e(N,0)=1pN1p+(1pN)e(N,0);e(N,0)=pN11p.

1
Mungkin bekerja secara iteratif daripada secara rekursif mungkin lebih baik? Anda memiliki yang memberi dan dan seterusnya memberikanAtau persamaan perbedaan dapat diselesaikan "secara teoritis" alih-alih dengan iterasi.
e(N,M)=12e(N,M+1)+12e(N,0)+1
e(N,M+1)=2e(N,M)2N+1
e(N,1)=2e(N,0)2N+1=2(2N+12)2N+1=2N+14e(N,2)=2e(N,1)2N+1=2(2N+14)2N+1=2N+18
e(N,M)=2N+12M+1.
Dilip Sarwate

@Dilip Inferensi yang Anda gambar pada "yang memberi" dan "dan seterusnya" bersifat rekursif. Metode solusi apa yang Anda pikirkan dengan "diselesaikan secara teoritis"?
whuber

Menurut saya, perbedaan antara rekursif dan iteratif adalah metode bekerja. Untuk relasi rekursi menghitung sebagai sementara iterasi mengatakan " Secara teoritis "berarti menyelesaikan persamaan perbedaan dengan menemukan polinom karakteristik, menentukan akarnya, dan kemudian mencocokkan solusi umum dengan kondisi awal, alih-alih perhitungan sederhana seperti di atas.
x(n)=2x(n1),  x(0)=1,
x(n)
x(n)=2x(n1)=2(2x(n2))=2(2(2x(n3)))==2(2(2x(0))=2n
x(0)=1x(1)=2x(0)=2x(2)=2x(1)=22x(n)=2x(n1)=22n1=2n.
Dilip Sarwate

Dari sudut pandang pemrograman, program find_x(n)rekursif jika ia mengatakan sesuatu seperti if n=0 return 1 else return 2*find_x(n-1)yang find_xmenyebut dirinya kali, sedangkan program berulang akan mengatakan sesuatu sepertiny = 1; while n > 0 do begin y=2*y; n=n-1 end; return y
Dilip Sarwate

Jika Anda melihat bagaimana program-program tersebut benar-benar diimplementasikan pada komputer, @Dilip, di banyak lingkungan (seperti R) mereka hampir tidak berbeda sama sekali. (Dalam satu kasus Anda membuat dan kemudian memproses vektor 1:ndan di lain Anda akan menemukan bahwa n:1telah ditempatkan pada tumpukan dan diproses secara terbalik.) Tetapi sebagian dari poin saya adalah konseptual : komentar awal Anda berbicara tentang "bekerja secara iteratif." Itu merujuk pada analisis dan bukan pada program komputer mana pun. Tetapi ini adalah hal-hal sepele dan tangensial yang pembahasannya tidak menjamin perpanjangan utas komentar ini.
whuber

5

Untuk mengatasi masalah ini, saya akan menggunakan proses stokastik, waktu berhenti, dan pemrograman dinamis.

Pertama, beberapa definisi:

X 0 X 0 = 0 X X 0 = M

Xn#(of consecutive heads after the nth flip)
Kami juga mengizinkan nilai untuk untuk berarti jumlah head berurutan sebelum kita mulai. Jadi, untuk dan urutan flips HHTHHHTHTTHH, nilai yang sesuai adalah 120123010012. Jika kami memiliki , nilai X akan menjadi (M + 1) (M + 2) 0123010012.X0X0=0XX0=M

Kemudian tentukan waktu berhenti berikut:

τNmin{k:Xk=N} and τ0min{k>1:Xk=0}

Nilai yang kami cari adalah nilai yang diharapkan dari , jumlah flips yang diperlukan untuk mengamati N flips berurutan , mengingat bahwa kami telah mengamati flips beruntun M . Asumsikan sebagai jawabannya sepele 0 sebaliknya. Kami menghitung:τN(XτN=N)(X0=M)MN

E[τN|X0=M]=E[τN1{τN<τ0}+τN1{τN>τ0}|X0=M]
=(NM)(12)NM+E[τ0|τN>τ0,X0=M]+(1(12)NM)E[τN|X0=0]
Ini membuat kita menghitung dua harapan bersyarat terakhir.

Yang pertama sesuai dengan jumlah flips yang diharapkan sebelum mendapatkan ekor dengan asumsi ekor terbalik sebelum N kepala berturut-turut diamati dengan asumsi kita mulai dengan M kepala berturut-turut. Tidak terlalu sulit untuk melihatnya

E[τ0|τN>τ0,X0=M]=j=1NM(j)(12)j=2(NM+2)(12)NM

Sekarang yang harus kita lakukan adalah menghitung ekspektasi kondisional kedua yang sesuai dengan jumlah flips yang diharapkan untuk mengamati N head berturut-turut mulai dari 0. Dengan perhitungan yang sama, kita melihat bahwa

E[τN|X0=0]=E[τN1{τN<τ0}+τN1{τN>τ0}|X0=0]
=N(12)N+E[τ0|τN>τ0,X0=0]+(1(12)N)E[τN|X0=0]
=2N{N(12)N+(2(N+2)(12)N)}
=2N+12

Ini memberikan jawaban terakhir:

E[τN|X0=M]=(NM)(12)NM+2(NM+2)(12)NM+(1(12)NM)(2N+12)
=2N+12M+1

Ini setuju dengan empat kasus uji yang Anda daftarkan. Dengan jawaban yang begitu sederhana, mungkin ada cara yang lebih mudah untuk menghitung ini.


1
Ini adalah cara yang lebih sulit untuk menyelesaikannya daripada ide rekursif yang tercantum di atas, tetapi sangat berguna untuk melihat kedua pendekatan tersebut disusun bersama. Kebanyakan orang tidak menghargai cara penghentian metode waktu dapat digunakan untuk masalah kecil dan praktis juga.
ely

2

Peringatan: yang berikut ini mungkin tidak dianggap sebagai jawaban yang tepat karena tidak memberikan solusi bentuk tertutup untuk pertanyaan, esp. bila dibandingkan dengan jawaban sebelumnya . Namun saya menemukan pendekatan yang cukup menarik untuk mengerjakan distribusi bersyarat.

Pertimbangkan pertanyaan awal untuk mendapatkan urutan head dari throws, dengan probabilitas . Ini diberikan oleh rumus pengulangan Memang, alasan saya adalah bahwa tidak ada head berturut-turut dari draw dapat diuraikan berdasarkan pada kemunculan pertama tail dari yang pertama melempar. Pendingin pada apakah ekor pertama ini terjadi pada pertama, kedua, ..., th menarik mengarah ke hubungan pengulangan ini.Nk1p(N,k)

p(N,k)={1if k<Nm=1N12mp(N,km)else
NkNN

Berikutnya, probabilitas mendapatkan N head pertama berturut-turut di throws adalah $$ q (N, m) = \ begin {cases} \ dfrac {1} {2 ^ N} & \ text {jika} m = N \mN

     p(N,m-N-1) \dfrac{1}{2^{N+1}} &\text{if } N<m<2N+1
     \end{cases}

$$ Kasus pertama cukup jelas. case kedua sesuai dengan ekor yang terjadi pada undian , diikuti oleh head, dan case terakhir melarang head berturut-turut sebelum undian . (Dua kasus terakhir bisa diringkas menjadi satu, diberikan!)mN1NNmN1

Sekarang, probabilitas untuk mendapatkan head pertama dan head berturut-turut pertama tepat di melempar (dan tidak kurang) adalah $$ r (M, N, m) = \ begin {cases} 1/2 ^ N & \ text {if} m = N \MN mN

     0 &\text{if } N<m\le N+M\\

      \dfrac{1}{2^{M}}\sum_{r=M+1}^{N}\dfrac{1}{2^{r-M}}q(N,m-r)&\text{if } N+M<m

\ end {cases} s (M, N, m) = \ begin {cases} 1 / {2 ^ {NM}} & \ text {if} m = N \ 0 & \ text {if} N \ sum_ {r = M + 1} ^ {N} \ dfrac {q (N, mr)} {2 ^ {rM }} & \ teks {jika} N + M

Hencetheconditionalprobabilityofwaiting$m$stepstoget$N$consecutiveheadsgiventhefirst$M$consecutiveheadsis

\ end {cases} \ mathfrak {E} (M, N) = \ sum_ {m = N} ^ \ infty m \, s (M, N, m) $$ atau untuk jumlah langkah tambahan ...

Theexpectednumberofdrawscanthenbederivedby
E(M,N)M
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.