Bab ACM lokal saya memberikan hadiah langsung kepada orang-orang yang datang ke pertemuan. Namun, Anda mendapat peluang menang yang lebih besar jika Anda memecahkan teka-teki pemrograman (tapi saya selalu memecahkan teka-teki itu). Jadi, beberapa orang memiliki 1 entri, sementara yang lain memiliki 2. Tapi tunggu! Cara kerja program undian tidak dengan menambahkan entri lain ketika seseorang memecahkan teka-teki. Alih-alih, ia melacak jumlah "nyawa" yang dimiliki seseorang, menyatakan bahwa jika orang itu dipilih di setiap pass dari algoritma pengambilan sampel acaknya. Jadi kerjanya seperti ini:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
Kemudian program secara acak memilih salah satu dari [Doorknob, xnor, Justin, Alex, Dennis]
, mengurangi nomornya (katakan itu pilih Justin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
Dan berulang. Jika jumlah "kehidupan" seseorang masuk ke 0
(mari kita pilih Justin
lagi), mereka dihapus dari daftar:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
Ini berlanjut sampai ada satu orang yang tersisa; orang itu adalah pemenangnya.
Sekarang pertanyaan sebenarnya adalah, berapa probabilitas saya akan menang?
Anda akan diberikan dua input:
n
. Ini adalah jumlah orang yang ikut tantangank
. Ini adalah jumlah orang (dari merekan
) yang memiliki 2 nyawa. Nomor ini selalu termasuk Anda.
Jadi jika saya memiliki fungsi p
dan menelepon p(10, 5)
, itu akan menjadi probabilitas untuk memenangkan hadiah di mana ada total 10 orang, 5 di antaranya hanya memiliki 1 kehidupan, sedangkan 5 (termasuk Anda) memiliki 2 kehidupan.
Anda diharapkan menghasilkan probabilitas untuk menang tepat, atau sebagai desimal. Bagaimanapun, jawaban harus akurat hingga dan termasuk tempat desimal ke- 4 setelah titik desimal. Apakah Anda membulatkan ke angka itu terserah Anda.
Solusi Anda mungkin menjadi solusi acak yang output jawaban untuk 4 th tempat desimal dengan probabilitas tinggi . Anda dapat berasumsi bahwa RNG bawaan yang Anda gunakan benar-benar acak, dan harus menghasilkan jawaban yang benar dengan setidaknya 90% probabilitas.
Selain itu, kode Anda hanya perlu berfungsi n, k <= 1000
, meskipun saya memang memberikan kasus uji lebih besar dari itu untuk mereka yang penasaran.
Uji Kasus
Catatan: beberapa di antaranya adalah rumus umum.
n, k | output
----------+---------
1, 1 | 1
2, 2 | 0.5
2, 1 | 0.75
3, 1 | 11/18 = 0.611111111
1000, 1 | 0.007485470860550352
4, 3 | 0.3052662037037037
k, k | 1/k
n, 1 | (EulerGamma + PolyGamma[1 + n])/n (* Mathematica code *)
| (γ + ψ(1 + n))/n
10, 6 | 0.14424629234373537
300, 100 | 0.007871966408910648
500, 200 | 0.004218184180294532
1000, 500 | 0.0018008560286627948
---------------------------------- Extra (not needed to be a valid answer)
5000, 601 | 0.0009518052922680399
5000, 901 | 0.0007632938197806958
Untuk beberapa cek lainnya, lakukan hal p(n, 1) * n
berikut:
n | output
------+---------
1 | 1
2 | 1.5
3 | 1.8333333333333335
10 | 2.928968253968254
100 | 5.1873775176396215
-------------------------- Extra (not needed to be a valid answer)
100000| 12.090146129863305
k
tidak aktif satu per satu)