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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王莹 中级黑马   /  2012-6-19 00:05  /  4218 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王莹 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
  • switch(sum)
  • {
  • //和有11种情况
  • case 2: num2++;break;//对和是2的结果进行计数
  • case 3:break;
  • case 4:break;
  • case 5:break;
  • case 6:break;
  • case 7:num7++;break;
  • case 8:break;
  • case 9:break;
  • case 10:break;
  • case 11:break;
  • case 12: num12++;break;
  • default:
  • System.out.println("the number is wrong!"); break;
  • 以上这代码可以写成:
  • case 2: num2++;break;//对和是2的结果进行计数
  • case 7:num7++;break;
  • case 12: num12++;break;
  • 这样判断次数就大大减少了哦

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
除此之外,没有更好的解法吗?最好也可以添加一些异常处理,或者用更加科学的方法进行运算之类的
回复 使用道具 举报
本帖最后由 陆强强 于 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);
           }

}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
陆强强 发表于 2012-6-19 07:26
class Possible
{

其实,我感觉得出的结果不太准确,比如,7应该占1/6,小数约等于0.166667,可是,每次运行出来的结果都与之有差距,请问是否有更加科学的算法呢?
回复 使用道具 举报
本帖最后由 陆强强 于 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:27
7#
陆强强 发表于 2012-6-20 13:38
你设置的次数太少了的缘故,
这是我360000次运算的结果。就把3600后面加两个0
0.1666063888888883

谢谢~~我知道了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马