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

人称猪 2013-07-26 01:40:34
题目:

一个人,任意一天,他都有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次之后,测试几次输出的结果的差异竟然差距很大。不知道是什么原因。
...全文
438 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
人称猪 2013-07-29
  • 打赏
  • 举报
回复
结贴,大家不要争论了。实验的结果已经验证了是1/3。 说60%的我想大家都是没有真正的做实验来判断,而是靠自己的逻辑来想的。 我发帖的本意不是想来跟大家争结果,而是来看程序的问题。 嘿嘿。
shift_nick 2013-07-28
  • 打赏
  • 举报
回复
引用 8 楼 f281186676f 的回复:
既然在A B都没有找到他,那么他如果去出喝酒的话一定是在C酒吧,这个概率不就是他出去喝酒的概率60%么,你们想复杂了,还是我脑抽了?
显然这是一个条件概率,它等于P(警察在C找到他)=P(出去并在C喝酒)/P(出去喝酒)
biaoyiddd 2013-07-28
  • 打赏
  • 举报
回复
所以无论在A,B,C喝酒的概率为多少应该都没有影响
biaoyiddd 2013-07-28
  • 打赏
  • 举报
回复
if(出去喝酒) 由于a,b都没找到,所以一定在c找到。那么找到他的概率为0.6就是他出去喝酒的概率,而他喝酒在C喝酒的概率为0.6/3=0.2 else(没出去喝酒) 一定找不到。概率为0.4.则找到他的概率为0 因此应该是0.6(不要把出去在哪喝酒的概率和警察能找打他的概率搞混了)
  • 打赏
  • 举报
回复
不喝酒,警察死了再喝。
feixuyue 2013-07-27
  • 打赏
  • 举报
回复
60% 。
lizhibin11 2013-07-27
  • 打赏
  • 举报
回复
上面写错了,是20%/(20%+40%)=1/3
lizhibin11 2013-07-27
  • 打赏
  • 举报
回复
缺少条件无法计算,这个不知道怎么编程验证。
如果附加条件,比如去三个酒馆的概率一样,那么当天不在A和B时,可能在C也可能没喝酒,在C的概率为20%/(20%+60%)=1/3 。这个可以编程验证。
o0冰凉0o 2013-07-27
  • 打赏
  • 举报
回复
不是60%吗?
倒退一天 2013-07-27
  • 打赏
  • 举报
回复
swardmanVC 2013-07-26
  • 打赏
  • 举报
回复
条件概率,60%,这个需要计算么?
人称猪 2013-07-26
  • 打赏
  • 举报
回复
大家还是用实验来验证吧
Regan-lin 2013-07-26
  • 打赏
  • 举报
回复
引用 8 楼 f281186676f 的回复:
既然在A B都没有找到他,那么他如果去出喝酒的话一定是在C酒吧,这个概率不就是他出去喝酒的概率60%么,你们想复杂了,还是我脑抽了?
就是你想的那样,脑子没抽
OrangeMemoryH 2013-07-26
  • 打赏
  • 举报
回复
引用 8 楼 f281186676f 的回复:
既然在A B都没有找到他,那么他如果去出喝酒的话一定是在C酒吧,这个概率不就是他出去喝酒的概率60%么,你们想复杂了,还是我脑抽了?
一开始认为是1/3*60% 但后来 我认同楼上
CNBLUE寻 2013-07-26
  • 打赏
  • 举报
回复
明显 就是百分之60 你们想复杂了吧 ab没找到 那不是在c就是没去啊 在c的概率不是百分之60么???
e251396 2013-07-26
  • 打赏
  • 举报
回复
引用 8 楼 f281186676f 的回复:
既然在A B都没有找到他,那么他如果去出喝酒的话一定是在C酒吧,这个概率不就是他出去喝酒的概率60%么,你们想复杂了,还是我脑抽了?
我也觉得是这样的。
云飞兄 2013-07-26
  • 打赏
  • 举报
回复
既然在A B都没有找到他,那么他如果去出喝酒的话一定是在C酒吧,这个概率不就是他出去喝酒的概率60%么,你们想复杂了,还是我脑抽了?
烈火蜓蜻 2013-07-26
  • 打赏
  • 举报
回复
神题,看不懂。
cheng2005 2013-07-26
  • 打赏
  • 举报
回复
Random random = new Random();没参数默认是用时间当种子,你程序运行的很快,这样就造成了种子相同的会比较多。剩下的你也懂得,种子相同,算法相同,取出来的结果就相同,这样不能算随机数了,结果都集中在一起了。
人称猪 2013-07-26
  • 打赏
  • 举报
回复
引用 4 楼 wddw1986 的回复:
如果针对你的代码来说,首先把 Random random = new Random(); 放到类里。 private static Random random = new Random();
额好吧,确实是你所说的那样, 为什么把 Random random = new Random(); 放到类里。 private static Random random = new Random(); 结果差异会这么大呢?或者说这么做有什么区别呢?
加载更多回复(4)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧