Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Birthday Paradox ใน C++

Birthday paradox เป็นปัญหาที่มีชื่อเสียงมากในส่วนของความน่าจะเป็น ปัญหานี้ระบุว่า

มีคนหลายคนในงานปาร์ตี้วันเกิด บางคนมีวันเกิดซ้ำกัน (birthday collision) เราต้องหาจำนวนคนประมาณในงานปาร์ตี้วันเกิดโดยอิงจากการมีวันเกิดเดียวกัน

ในความน่าจะเป็น เรารู้ว่โอกาสได้หัวก้อยคือ 1/2 เหมือนกับถ้าเรามีเหรียญบางอัน โอกาสได้ 10 หัวคือ 1/100 หรือ 0.001

มาทำความเข้าใจแนวคิด

โอกาสของสองคนที่มีวันเกิดต่างกันคือ

364/365 ซึ่งคือ 1-1/365 ในปีที่ไม่ใช่ปีอธิกสุรทิน

ดังนั้นเราสามารถพูดได้ว่าคนแรกมีความน่าจะเป็นของวันเกิดเฉพาะคือ '1' และสำหรับคนอื่นๆ จะแตกต่างกันซึ่งคือ

P(ต่างกัน) = 1 × (1-1/365) × (1-2/365) × (1-3/365) × (1-4/365) ......

ดังนั้น P(เหมือนกัน) = 1 - P(ต่างกัน)

ตัวอย่าง

จำนวนคนที่มีวันเกิดเดียวกันซึ่งความน่าจะเป็นคือ 0.70

N = √(2 × 365 × log(1/(1-p)))

N = √(2 × 365 × log(1/(1-0.70))) = 30

ดังนั้น จำนวนคนประมาณที่มีวันเกิดเดียวกันคือ 30

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

int findPeople(double p) {
    return ceil(sqrt(2 * 365 * log(1 / (1 - p))));
}

int main() {
    printf("%d", findPeople(0.70));
    return 0;
}

ผลลัพธ์

30