生日悖论,指如果一个房间里有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
运行结果符合
原标题:C#模拟程序验证 生日悖论
关键词:C#