你的位置:首页 > ASP.net教程

[ASP.net教程]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

 运行结果符合