C#模擬程序驗證 生日悖論,
生日悖論,指如果一個房間裡有23個或23個以上的人,那麼至少有兩個人的生日相同的概率要大於50%,准確的說是50.7左右,這就意味著在一個典型的標准小學班級(30人)中,存在兩人生日相同的可能性更高。對於60或者更多的人,這種概率要大於99%。從引起邏輯矛盾的角度來說生日悖論並不是一種悖論,從這個數學事實與一般直覺相抵觸的意義上,它才稱得上是一個悖論。大多數人會認為,23人中有2人生日相同的概率應該遠遠小於50%。
這個結果是可以有數學公式計算出來的,咱們不談公式,直接實踐,用程序來模擬生成一個房間,包含23個人,檢測有無生日重復項。重復多次,累計結果即可,一下是源碼(控制台程序)

![]()
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
//一個日期,一個隨機器,用來生成隨機生日
private static DateTime dt = Convert.ToDateTime("12-31");
private static Random ran = new Random();
/// <summary>
/// 房間數量
/// </summary>
private static int roomNumber = 0;
/// <summary>
/// 符合條件的房間數量
/// </summary>
private static int roomRight = 0;
/// <summary>
/// 嘗試次數
/// </summary>
private static int test = 0;
static void Main(string[] args)
{
Console.WriteLine("請輸入執行次數,只能為整數");
try
{
test = Convert.ToInt32(Console.ReadLine());
Thread t1 = new Thread(new ThreadStart(start));
t1.Start();
}
catch
{
Console.WriteLine("輸入有誤,請重新運行。");
}
Console.ReadLine();
}
/// <summary>
/// 開始進行模擬測試
/// </summary>
private static void start()
{
for (int i = 0; i < test; i++)
{
DateTime[] dtRoom = creatRoom();
if (checkBirsday(dtRoom) == true)
roomRight++;
Console.WriteLine("剩余:"+(test - i).ToString());
}
float probability = Convert.ToSingle(roomRight) / Convert.ToSingle(roomNumber);
Console.WriteLine(String.Format("共 {0} 間房間,符合條件的有 {1} 間,概率 {2}", roomNumber, roomRight,probability));
}
/// <summary>
/// 生成一個房間,內部包含23個隨機的生日
/// </summary>
/// <returns></returns>
private static DateTime[] creatRoom()
{
DateTime[] people = new DateTime[23];
for (int i = 0; i < people.Length; i++)
{
people[i] = creatBirsday();
}
roomNumber++;
return people;
}
/// <summary>
/// 隨機生成一個日期
/// </summary>
/// <returns></returns>
private static DateTime creatBirsday()
{
int RandKey = ran.Next(0,365);
DateTime dtBirsday = dt.AddDays(RandKey*(-1));
return dtBirsday;
}
/// <summary>
/// 檢驗房間內有生日重復項
/// </summary>
/// <param name="dtBrisday"></param>
/// <returns></returns>
private static bool checkBirsday(DateTime[] dtBrisday)
{
for (int i = 0; i < dtBrisday.Length; i++)
{
int id = Array.IndexOf(dtBrisday, dtBrisday[i]); // 這裡的1就是你要查找的值
if (id != -1 && id!=i)
return true;
}
return false;
}
}
}
View Code
運行結果符合
