生日悖論,指如果一個房間里有23個或23個以上的人,那麼至少有兩個人的生日相同的概率要大於50%,準確的說是50.7左右,這就意味著在一個典型的標準小學班級(30人)中,存在兩人生日相同的可能性更高。對於60或者更多的人,這種概率要大於99%。從引起邏輯矛盾的角度來說生日悖論並不是一種悖論,從這個數 ...
生日悖論,指如果一個房間里有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
運行結果符合