目前这个版本的c++模拟效率并不算高,还得改进代码,但是实现了想要的功能。
这个概率值是50%。
// C++ Code Challenges, LinkedIn Learning
// Challenge #16: The Birthday Problem
// The birthday problem consists in finding the probability of having at least two people with the same birthday in a group of n people.
// Create an application that simulates the Birthday Problem 1 million times, with the number of people specified by the user.
// Use this application to prove (empirically) that the probability of having at least 2 people with the same birthday is approximately 0.5 for a group of 23 people.
// https://en.wikipedia.org/wiki/Birthday_problem
#include <iostream>
#include <chrono>
#include <iostream>
#include <random>
#include <set>
// Function to generate a random month
int generate_month() {
// Initialize random number generator
std::random_device rd;
std::mt19937 gen(rd());
// Define the range for the month (1 to 12)
std::uniform_int_distribution<> month_dist(1, 12);
return month_dist(gen);
}
// Function to generate a random day based on the given month
int generate_day(int month) {
// Initialize random number generator
std::random_device rd;
std::mt19937 gen(rd());
// Define the range for the day based on the month
int days_in_month;
if (month == 2) {
days_in_month = 28; // Assume non-leap year for simplicity
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
days_in_month = 30;
} else {
days_in_month = 31;
}
std::uniform_int_distribution<> day_dist(1, days_in_month);
return day_dist(gen);
}
// The Birthday Problem, main()
// Summary: This application simulates the birthday problem a large number of times to reveal the probability of a birthday match in a groupd of a given number of people.
int main(){
const int total = 1000000;
int n, matches;
std::cout << "Enter the number of people in the group: " << std::flush;
std::cin >> n;
if(n > 366)
matches = total;
else{
// Write your code here
matches = 0;
for (int j = 0; j < total; ++j){
std::set<std::pair<int,int>> month_day_set;
for (int i=0; i<n; ++i){
int month = generate_month();
// Generate a random day based on the generated month
int day = generate_day(month);
month_day_set.insert({month,day});
}
int num = n - month_day_set.size()?1:0;
matches += num;
std::cout << "j = " << j << " matches = " << matches << std::endl;
}
}
std::cout << "The probability of a birthday match is " << (double)matches/total << "\n\n" << std::flush;
return 0;
}
系统当前共有 481 篇文章