บท ACM ท้องถิ่นของฉันมอบรางวัลให้กับคนที่เข้าร่วมการประชุม คุณจะได้รับโอกาสเพิ่มขึ้นในการชนะถ้าคุณไขปริศนาการเขียนโปรแกรม (แต่ฉันจะแก้ปริศนานั้นเสมอ) ดังนั้นบางคนมี 1 รายการขณะที่คนอื่นมี 2 แต่เดี๋ยวก่อน! วิธีการทำงานของโปรแกรมล็อตเตอรี่ไม่ใช่การเพิ่มในรายการอื่นเมื่อมีคนไขปริศนา แต่จะติดตามจำนวน "ชีวิต" ของบุคคลที่มีลดลงว่าหากบุคคลนั้นถูกเลือกในแต่ละรอบของอัลกอริทึมการสุ่มตัวอย่าง ดังนั้นจึงใช้งานได้เช่นนี้:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
จากนั้นโปรแกรมจะสุ่มเลือกหนึ่งใน[Doorknob, xnor, Justin, Alex, Dennis]
นั้นลดจำนวนลง (พูดว่าเลือกJustin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
และทำซ้ำ หากจำนวน "ชีวิต" ของใครบางคนไปที่0
(เลือกJustin
อีกครั้ง) พวกเขาจะถูกลบออกจากรายการ:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
สิ่งนี้จะดำเนินต่อไปจนกว่าจะมีคนเหลืออีกคนหนึ่ง บุคคลนั้นเป็นผู้ชนะ
ตอนนี้คำถามจริงคือความน่าจะเป็นที่ฉันจะได้รับคืออะไร?
คุณจะได้รับสองอินพุต:
n
. นี่คือจำนวนคนที่เข้าสู่การท้าทายk
. นี่คือจำนวนของคนn
ที่มี 2 ชีวิต หมายเลขนี้รวมถึงคุณเสมอ
ดังนั้นถ้าฉันมีฟังก์ชั่นp
และเรียกp(10, 5)
ว่าน่าจะเป็นความน่าจะเป็นที่ได้รับรางวัลซึ่งมีทั้งหมด 10 คนซึ่ง 5 ในนั้นมีเพียง 1 ชีวิตในขณะที่ 5 (รวมถึงคุณ) มี 2 ชีวิต
คุณคาดว่าจะส่งออกความน่าจะเป็นของการชนะอย่างแน่นอนหรือเป็นทศนิยม ในอัตราใดจะต้องเป็นคำตอบที่ถูกต้องขึ้นไปและรวมทั้ง 4 THทศนิยมตำแหน่งหลังจุดทศนิยม ไม่ว่าคุณจะปัดเศษตัวเลขนั้นขึ้นอยู่กับคุณหรือไม่
วิธีการแก้ปัญหาของคุณอาจจะเป็นทางออกที่สุ่มซึ่ง outputs คำตอบ 4 THทศนิยมตำแหน่งที่มีความน่าจะเป็นสูง คุณอาจสันนิษฐานว่า RNG ในตัวที่คุณใช้นั้นสุ่มมาอย่างแท้จริงและต้องส่งคำตอบที่ถูกต้องโดยมีความน่าจะเป็นอย่างน้อย 90%
นอกจากนี้รหัสของคุณต้องการเพียงแค่การทำงานn, k <= 1000
ถึงแม้ว่าฉันจะให้การทดสอบที่ใหญ่กว่านั้นสำหรับผู้ที่อยากรู้อยากเห็น
กรณีทดสอบ
หมายเหตุ: บางส่วนเป็นสูตรทั่วไป
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
สำหรับการตรวจสอบอีกสองสามข้อให้ทำp(n, 1) * n
ดังนี้:
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
มันถูกปิดโดยคน ๆ หนึ่ง)