A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 酱油 于 2016-2-13 20:16 编辑

过年了,黑马为学生们举行了一次抽奖活动,规则如下:
      首先,所有参加抽奖的的人都将一张写有自己名字的字条放入抽奖箱中;
      然后,待所有字条加入完毕,每人从箱中取一个字条;
      最后,如果取得的字条上写的就是自己的名字,那么就表示中奖了!
但是。悲剧的是,最后却发现现场的所有人都没有中奖,。。。
好的,那么问题来了,请用编写程序计算一下,发生这种情况的概率是多少?
问题要求:用键盘输入一个整数P表示参加抽奖活动的人数。
          程序运行,输出结果为所有人都没中奖的概率。用百分号表示,四舍五入保留两位小数。
          如输入2,结果运行输出答案应该是50.00%

答题要求:1、写出解题思路。
                  2、运行截图,输出结果按照题中要求
                  3、不得百度、抄袭,如有发现,,,没有分哦
                   4、答对经过审核者,可获得10个黑马币




33 个回复

倒序浏览
概率是0
回复 使用道具 举报

我要举报洋葱刷分!
回复 使用道具 举报
好难啊,像我这种半路出家的,看个排序的算法都得半天,这题估计是搞不定了
回复 使用道具 举报
西贝 发表于 2016-2-1 23:33
好难啊,像我这种半路出家的,看个排序的算法都得半天,这题估计是搞不定了 ...

是要考一点思维,,不过写程序就是要锻炼思维。我觉得这种题,平时接触接触也挺好的,我提示一下吧,属于排列组合的数学问题。
回复 使用道具 举报
本帖最后由 Bobby1109 于 2016-2-2 00:32 编辑

思路:总的来讲,先列出所有可能情况,逐一对每一种情况检查,删除不符合要求的情况。最后用符合要求情况数量除以所有可能情况数量得到概率。
具体如下:
1. 事件模型:
创建一个元素类型为Integer的List集合aList。并利用for循环为每个元素赋值。
将参与抽奖的每个人视为集合中的每个元素。一个人抽中奖可理解为元素的值和元素的索引相同。

2. 列出所有可能情况:
在while循环中利用Collections.shuffle(aList) 对元素进行排列,每排一次就把aList中的元素转为String elemStr(元素间空格分开),并把elemStr存入TreeSet resultSet中。当resultSet的大小为抽奖人数P的阶乘时,循环停止。至此,resultSet中的元素为所有可能情况。

3. 删除不符合要求的情况:
遍历resultSet,如果某元素第i位上的数值为i,表示该人抽到自己的名字,则删除该元素。即删除抽到自己的情况。

4. 输出结果:
double result = resultList.size()*1.0/P! * 100;
将 result 转为字符串后截取小数点后两位的字符串作为子字符串并加上% 输出至控制台即可。

输出结果格式图片:
               



评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报
酱油 来自手机 高级黑马 2016-2-2 11:58:14
7#
Bobby1109 发表于 2016-2-2 00:26
思路:总的来讲,先列出所有可能情况,逐一对每一种情况检查,删除不符合要求的情况。最后用符合要求情况数 ...

代码一起贴上看看。
回复 使用道具 举报
中奖 概率是1/P,你在逗我,这个有什么好编程计算的
回复 使用道具 举报
youngrivers 发表于 2016-2-5 01:15
中奖 概率是1/P,你在逗我,这个有什么好编程计算的

这个属于概率学最基础的东西了
回复 使用道具 举报
youngrivers 发表于 2016-2-5 01:17
这个属于概率学最基础的东西了

呵呵 麻烦先看清题意 我可没让你求中奖的概率  
回复 使用道具 举报
附件Test.zip直接改名成Test.java。
下面是代码和截图,附件中也是代码和截图。
楼主快赏我!!!{:2_32:}
/*
1、获取用户输入的人数;
2、判断输入的人数,如果为1,说明0.00%的概论都抽不中;如果大于1,则运行运算;如果都不是则提示输入错误;
3、根据规律,都抽不中的概率为(x-1)!/(x!),计算都抽不中的概率;
4、通过四舍五入化为四位数的整数result;
5、a为小数点前两位数,即result除以100的商;
6、b为小数点后两位数,如果b的长度为1,那么结果应为0x,因此,在b前在连上一个0;
7、打印输出a与b连接后的字符串并加上%号;
*/

import java.util.Scanner;
class Test {
public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  System.out.println("请输入人数:");
  int num = sc.nextInt();
  double x = 1;
  if (num == 1) {
   System.out.println("0.00%");
  } else if (num > 1) {
   for (int i = num; i > 1; i--) {
    x *= ((i - 1) / (i * 1.0));
   }
   long result = Math.round(x * 10000);
   
   String a = (result / 100) + "";
   String b = (result % 100) + "";
   
   if(b.length() == 1) {
    b = "0" + b;
   }
   
   System.out.println("所有人都没中奖的概论为:" + a + "." + b + "%");
  } else {
   System.out.println("输入的人数有误!");
  }
}
}


Test.zip (1.06 KB, 下载次数: 188)

QQ截图20160213173314.png (78.6 KB, 下载次数: 50)

QQ截图20160213173314.png

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
洋葱头头 + 1 + 2

查看全部评分

回复 使用道具 举报
wusiyi 发表于 2016-2-13 17:38
附件Test.zip直接改名成Test.java。
下面是代码和截图,附件中也是代码和截图。
楼主快赏我!!!

没怎么看懂你的思路,,不过,我验证了一下你的结果,是错的。给你看一下我测试的数据吧,这是我原来在oj网站上做的题,AC了的,所以数据是肯定准确的,当然你也可以用数学概率来算,10以内的人数,来验证你自己的程序结果是不是对的。你再考虑考虑吧,找的规律应该不对,还有你的保留两位小数的方法,有些麻烦了,java有很多种方法直接保留两位小数,你可以去百度看一下。你可以继续做,过两天给你分,,加油、PS:图片上,第一行是我输入的测试数据组数。后面没两行为一组数据,第一行表示人数,第二行表示概率。

}WAK$MKE~N7ZO(SU$1EEC9E.png (16.7 KB, 下载次数: 32)

}WAK$MKE~N7ZO(SU$1EEC9E.png
回复 使用道具 举报
酱油 发表于 2016-2-13 19:16
没怎么看懂你的思路,,不过,我验证了一下你的结果,是错的。给你看一下我测试的数据吧,这是我原来在oj ...

我把权限取消了。。
回复 使用道具 举报
wusiyi 发表于 2016-2-13 17:38
附件Test.zip直接改名成Test.java。
下面是代码和截图,附件中也是代码和截图。
楼主快赏我!!!

权限取消了
回复 使用道具 举报
酱油 发表于 2016-2-13 19:16
没怎么看懂你的思路,,不过,我验证了一下你的结果,是错的。给你看一下我测试的数据吧,这是我原来在oj ...

你的结果中,从7开始概率就没变了耶。。。
回复 使用道具 举报
youngrivers 发表于 2016-2-5 01:15
中奖 概率是1/P,你在逗我,这个有什么好编程计算的

嗯,楼主,概率确实是1/P.
如果有P人,那么第一个人抽不中的概率为P-1/P;
第二个人抽的时候只剩下P-1,所以第二个人抽中的概率为P-1-1/P-1;
.....
然后倒数第二个人抽的时候1/2;
所以就是(P-1)!/P!
所以就是1/P。
楼主给分呗。
回复 使用道具 举报 0 1
wusiyi 发表于 2016-2-13 20:38
嗯,楼主,概率确实是1/P.
如果有P人,那么第一个人抽不中的概率为P-1/P;
第二个人抽的时候只剩下P-1,所 ...

,,,,你认真看了么?说的是所有人都不中奖的概率 ,,你觉得会是1/P ?你也跟着他一起来逗我了?
回复 使用道具 举报
wusiyi 发表于 2016-2-13 20:33
你的结果中,从7开始概率就没变了耶。。。

因为这种问题当人数多了以后,所有人不中奖的发生概率就会变小,我这里是保留的2位小数,所以7以后基本变化都不大了。给你看一张另外的截图,,基本到了20以后概率就趋近于0了,,,(还有这道题,在数学里面是 属于 错排列问题,,有一个公式很简单解决这类问题。。。。是不是感觉被坑了?。、。。

Z~CK}P{CG~GK9P5D@DAYOQ6.png (37.57 KB, 下载次数: 51)

Z~CK}P{CG~GK9P5D@DAYOQ6.png
回复 使用道具 举报
酱油 发表于 2016-2-13 20:54
因为这种问题当人数多了以后,所有人不中奖的发生概率就会变小,我这里是保留的2位小数,所以7以后基本变 ...

关键是20的时候还是36%,到21就趋近于0%,这不科学!

点评

不知道函数里的突变么?  发表于 2016-2-13 21:26
回复 使用道具 举报
我再想想看看。。。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马