首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

一道概率的题目,看看小弟我写的程序哪里有有关问题

2013-08-04 
一道概率的题目,看看我写的程序哪里有问题题目:一个人,任意一天,他都有60%的概率出去喝酒,他只到A,B,C三家

一道概率的题目,看看我写的程序哪里有问题
题目:

一个人,任意一天,他都有60%的概率出去喝酒,他只到A,B,C三家酒吧喝酒。
一天,警察在A酒吧和B酒吧都没有找到他,那么警察能在C酒吧找到他的概率是多少。

问:

此题是否可解,如何可解,以编程运算验证此概率;
如果不可解,以程序运算验证此题不可解,并给出令此题可解的最简附加条件,并以编程运算验证概率结果。

猿们需要阐述程序设计的逻辑。对程序架构没有要求,只要求可以输入/输出能够反映关键问题的值即可。

我编写的测试代码:


    class Program
    {
        static void Main(string[] args)
        {
            int testTimes;
            Console.WriteLine("输入警察一共找了他多少次?");
            try
            {
                testTimes = int.Parse(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("输入的不是整数");
                return;
            }
            int findTimesInA = 0;
            int findTimesInB = 0;
            int findTimesInC = 0;
            for (int i = 0; i < testTimes; i++)
            {
                YeShen yeshen = new YeShen();
                if (yeshen.isDrink)//如果喝酒了
                {
                    if (yeshen.pub == Pub.A)
                    {
                        findTimesInA++;


                    }
                    else if (yeshen.pub == Pub.B)
                    {
                        findTimesInB++;
                    }
                    else if (yeshen.pub == Pub.C)
                        findTimesInC++;
                }
            }


            int yangben = testTimes - (findTimesInA + findTimesInB);
            double result = (double)findTimesInC / (testTimes - (findTimesInA + findTimesInB));

            Console.WriteLine("一共测试:" + testTimes.ToString() + "次,");
            Console.WriteLine("在酒店A被逮到" + findTimesInA.ToString() + "次");
            Console.WriteLine("在酒店B被逮到" + findTimesInB.ToString() + "次");
            Console.WriteLine("在酒店C被逮到" + findTimesInC.ToString() + "次");
            Console.WriteLine("概率样本:" + yangben.ToString() + "次");
            Console.WriteLine("最终概率" +findTimesInC +"/"+yangben +"="+ result.ToString("0.0000"));

            Main(new string[10]);
        }



        class YeShen //醉汉实体类
        {
            public bool isDrink;
            public Pub pub;



            public YeShen()
            {
                Random random = new Random();
                int i = random.Next(100);
                if (i < 60)
                {
                    isDrink = true;//小于60,出去喝酒了
                    int j = random.Next(3);//假设三家概率一样
                    pub = (Pub)j;//随机在三家的一家喝酒
                }
                else
                {
                    isDrink = false;
                }
            }
        }

        enum Pub
        { //枚举三家酒吧
            A = 0, B = 1, C = 2
        }
    }



我用写的代码进行测试。主要就是生成随机数,但是我输入测试1w次之后,测试几次输出的结果的差异竟然差距很大。不知道是什么原因。 测试
[解决办法]
这题我是觉得不可解,因为去A,B,C三家喝酒的概率没有给。
1/3 : 1/3 : 1/3

1/100 : 1/100 : 98/100 


得出的结果是不一样的。

[解决办法]
如果针对你的代码来说,首先把
Random random = new Random();
放到类里。
private static Random random = new Random();

[解决办法]
Random random = new Random();没参数默认是用时间当种子,你程序运行的很快,这样就造成了种子相同的会比较多。剩下的你也懂得,种子相同,算法相同,取出来的结果就相同,这样不能算随机数了,结果都集中在一起了。

热点排行