黑马程序员技术交流社区

标题: 求两个骰子和的概率问题 [打印本页]

作者: 王莹    时间: 2012-6-19 00:05
标题: 求两个骰子和的概率问题
本帖最后由 王莹 于 2012-6-22 10:56 编辑

这是以前我做过的一道JAVA程序题,最近翻出来了,想请教大家有没有更好的解法


题目:编写一个模拟同时掷2个骰子的程序。要用Math.random()模拟产生第1个骰子,然后再产生第2个骰子,将2个结果相加,相加的和等于7的可能性最大,等于2和12的可能性最小,共有36种可能的情况,程序模拟掷3600次骰子,判断求和结果是否合理。(由于共有6种情况的和是7,故在3600次掷骰子的过程中应有1/6的可能性是7)
  1. public class Possible
  2.   
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.          int a,b,sum,num2=0,num7=0,num12=0;
  7.                   double pro2=0,pro7=0,pro12=0;     //pro2,pro7,pro12是得到的概率值
  8.     for(int i=0;i<3600;i++)
  9.                 {
  10.                   a=(int)(Math.random()*6+1);         //定义两个变量a、b,分别接收随机生成的值,随机值在1~6之间
  11.   b=(int)(Math.random()*6+1);
  12.   sum=a+b;
  13.     switch(sum)
  14.                  {
  15.                           //和有11种情况
  16. case 2: num2++;break;//对和是2的结果进行计数
  17.                         case 3:break;
  18. case 4:break;
  19.                         case 5:break;
  20.                         case 6:break;
  21.                         case 7:num7++;break;
  22.                         case 8:break;
  23.                         case 9:break;
  24.                         case 10:break;
  25.                         case 11:break;
  26. case 12: num12++;break;
  27. default:
  28.                                            System.out.println("the number is wrong!"); break;
  29.                   }
  30.                   pro2=num2/3600.0;//得出和为2的次数的概率
  31.                   pro7=num7/3600.0;
  32.                   pro12=num12/3600.0;

  33.                 }
  34.                 System.out.println("相加等于7的概率是:"+pro7);
  35.                 System.out.println("相加等于2的概率是:"+pro2);
  36.                 System.out.println("相加等于12的概率是:"+pro12);
  37.         }
  38. }
复制代码

作者: 晏文根    时间: 2012-6-19 00:40

作者: 王莹    时间: 2012-6-19 06:03
除此之外,没有更好的解法吗?最好也可以添加一些异常处理,或者用更加科学的方法进行运算之类的
作者: 陆强强    时间: 2012-6-19 07:26
本帖最后由 陆强强 于 2012-6-19 07:32 编辑

class Possible
{

       public static void main(String[] args)

       {

             int num2=0,num7=0,num12=0;

             double pro2=0,pro7=0,pro12=0;     //pro2,pro7,pro12是得到的概率值

             for(int i=0;i<3600;i++)

         {

            int a=(int)(Math.random()*6+1);         //定义两个变量a、b,分别接收随机生成的值,随机值在1~6之间

            int b=(int)(Math.random()*6+1);

               if((a+b)==2)
                                num2++;//.给和等于2计数就好了,用if就不用给每个和的值判断一次了
               if((a+b)==7)
                                num7++;
               if((a+b)==12)
                                num12++;
         }

                pro2=num2/3600.0;//得出和为2的次数的概率

                pro7=num7/3600.0;

                pro12=num12/3600.0;
        System.out.println("相加等于7的概率是:"+pro7);

        System.out.println("相加等于2的概率是:"+pro2);

        System.out.println("相加等于12的概率是:"+pro12);
           }

}
作者: 王莹    时间: 2012-6-20 13:28
陆强强 发表于 2012-6-19 07:26
class Possible
{

其实,我感觉得出的结果不太准确,比如,7应该占1/6,小数约等于0.166667,可是,每次运行出来的结果都与之有差距,请问是否有更加科学的算法呢?
作者: 陆强强    时间: 2012-6-20 13:38
本帖最后由 陆强强 于 2012-6-20 13:45 编辑
王莹 发表于 2012-6-20 13:28
其实,我感觉得出的结果不太准确,比如,7应该占1/6,小数约等于0.166667,可是,每次运行出来的结果都与 ...


你设置的次数太少了的缘故,
这是我360000次运算的结果。就把3600后面加两个0
0.1666063888888883
0.0278077777777
0.02778388888888889
概率这东西主要看采集样本的数量,数量越多越接近理论值
作者: 王莹    时间: 2012-6-22 10:56
陆强强 发表于 2012-6-20 13:38
你设置的次数太少了的缘故,
这是我360000次运算的结果。就把3600后面加两个0
0.1666063888888883

谢谢~~我知道了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2