วิทย์โปรแกรมมิ่งวันศุกร์นี้ เด็กๆม.3 เขียนโปรแกรมไล่ดูว่าต้องมีคนสักกี่คนอยู่ด้วยกันแล้วความน่าจะเป็นที่จะมีคนวันเกิดซ้ำกันบ้างเกิน 50% พบว่าต้องมีคน 23 คนครับ
หน้าตาฟังก์ชั่นคำนวณความน่าจะเป็นที่คน k คนจะไม่มีวันเกิดซ้ำกันเลย และมีวันเกิดซ้ำกันบ้างจะเป็นประมาณนี้ครับ:
เราวาดกราฟดูด้วย matplotlib ได้ดังนี้ครับ:
เราสามารถดูปัญหาคล้ายๆกันคือแทนที่จะเป็นวันเกิดอาจจะเป็นสิ่งต่างๆจำนวนหลายชิ้น แล้วมีคนจำนวนหนึ่งมาเลือกสุ่มๆ ดูความน่าจะเป็นที่จะเลือกซ้ำกันก็ได้ครับ ถ้าจะแก้ปัญหาทั่วไปแบบนี้เราก็ดัดแปลงฟังก์ชั่นให้ยืดหยุ่นมากขึ้นดังนี้:
เช่นสมมุติว่ามีคนหลายคนใส่นาฬิกาโดยที่ไม่ได้ตั้งกันมาให้ตรงกับเวลามาตรฐานก่อน เข็มวินาทีของแต่ละคนก็อาจจะชี้เลขจาก 0 ถึง 59 ถ้าเราสมมุติว่าโอกาสที่เข็มชี้เลขต่างๆด้วยความน่าจะเป็นเท่าๆกัน เราก็สามารถหาโอกาสที่คน k คนจะมีเข็มวินาทีซ้ำกันอยู่ได้ด้วยฟังก์ชั่น prob_some_repeat(60, k) เราจะพบว่าเมื่อมีคน 10 คน ความน่าจะเป็นที่มีเข็มชี้ไปที่วินาทีซ้ำๆกันบ้างจะมากกว่า 50% ครับ
ด้วยคณิตศาสตร์ระดับสูงขึ้นไป เราจะสามารถคำนวณได้ว่าถ้ามีของให้เลือก N ชิ้น แล้วมีคน k คนมาเลือกสุ่มๆโดยโอกาสเลือกของแต่ละชิ้นเท่าๆกัน ความน่าจะเป็นที่จะมีการเลือกซ้ำจะมีค่า 50% เมื่อ k มีค่าประมาณ 1.2 √N เท่านั้นครับ
การบ้านคือให้เด็กๆไปทดลองหาว่าสำหรับของ 10, 10^2, 10^3, 10^4, 10^5, 10^6 ชิ้นต้องมีคนกี่คนเลือกถึงมีโอกาสเลือกซ้ำกันประมาณ 50% และใกล้กับค่า 1.2 √N ไหม