黑马程序员技术交流社区

标题: 老师给我出的关于双色球的一道题,想了很久想不出来! [打印本页]

作者: m6281838    时间: 2013-4-16 20:10
标题: 老师给我出的关于双色球的一道题,想了很久想不出来!
题意:
要求1:首先写一道程序,可以随机输出一注双色球的数。(这个我会写!)
要求2:让这道程序运行5000次,选出出现概率最大的7个数。(这个我真心不会了!)求高手为之解答一下~(尽量用循环和数组的方法来解决!)
万分感谢!

要求1的代码如下:
//双色球

public class DoubleBall {
        public static void main(String[] args) {
                int red = (int) (Math.random() * 16 + 1);
                int[] arr = new int[6];
                for (int i = 0; i < arr.length; i++) {
                        arr = (int) (Math.random() * 33 + 1);
                        for (int j = 0; j < i; j++) {
                                if (arr[j] == arr) {
                                        i--;
                                }
                        }
                }
                System.out.print("蓝球:");
                for (int i = 0; i < 6; i++) {
                        System.out.print(arr + " ");
                }
                System.out.println("\n红球:" + red);
        }
}

作者: 殇_心。    时间: 2013-4-16 20:30
这个的话也比较简单实现。
定义一个int  a[33],并初始化为0;// 33是随便定义的,双色球是多少个数来着?
                                              //这个数组为了存储双色球数字的个数。
如果出现一个num ,就a[num]++;
最后选好数字后,进行排序就是。
思想就是这样。。具体代码就不实现了。
作者: m6281838    时间: 2013-4-17 08:24
殇_心。 发表于 2013-4-16 20:30
这个的话也比较简单实现。
定义一个int  a[33],并初始化为0;// 33是随便定义的,双色球是多少个数来着?
    ...

哎,还是不懂你说的。只有给我具体代码我才弄的清楚~
作者: 殇_心。    时间: 2013-4-17 09:54
本帖最后由 殇_心。 于 2013-4-17 09:56 编辑
m6281838 发表于 2013-4-17 08:24
哎,还是不懂你说的。只有给我具体代码我才弄的清楚~

哥们,代码是在你基础上改的。你看看吧```  我觉得选数字不是这么回事吧?

import java.io.*;
import java.util.*;

public class Main extends RuntimeException
{
        public static void main(String[] args)throws IOException//代码在是你的基础上改的
        {
                int[] sum = new int[35];//这个数组用来保存数字的个数
                for( int i = 0; i < 35; i++ )//把数组进行初始化为0;
                {
                        sum = 0;
                }
                for( int j = 0; j < 5000; j++ ) //运行5000次
                {
                        int red = (int) (Math.random() * 16 + 1); //选红球
                        sum[red]++;//把红球数字也累加。
                        
                int[] arr = new int[6];
                for (int i = 0; i < arr.length; i++) //选蓝球
                {
                        arr = (int) (Math.random() * 33 + 1);
                        sum[arr]++; //把数字的个数累加
                }
               // System.out.print("蓝球:");
               // for (int i = 0; i < 6; i++) {
                   //     System.out.print(arr + " ");
            
              //  System.out.println("\n红球:" + red);
              
                }
                int[] tmp = new int[36];//定义一个数组,用来存储每个数字的位置
                for( int i = 0; i <= 35; i++ )
                {
                        tmp = i;
                }
           int t, q;//为了进行排序,定义的2个中间临时变量
           for( int i = 0; i < 35; i++ ) //选择排序
                   for( int j = i+1; j < 35; j++ )
                   {
                           if( sum > sum[j] )
                           {
                                   t = sum; q = tmp;
                                   sum = sum[j]; tmp = tmp[j];
                                   sum[j] = t;  tmp[j] = q;
                           }
                   }
            for( int i = 34; i > 27; i-- )//输出7个数字
            {
                    System.out.print(tmp+",");
            }
                System.out.println("");
        }
}
这代码贴上去怎么就少了点什么啊

作者: 陈圳    时间: 2013-4-17 10:22
本帖最后由 陈圳 于 2013-4-17 11:31 编辑
  1. import java.util.Arrays;
  2. import java.util.Random;
  3. public class DoubleBall {

  4.         /**要求1:首先写一道程序,可以随机输出一注双色球的数
  5.               要求2:让这道程序运行5000次,选出出现概率最大的7个数。*/
  6.         private static final int BALLNUM=7;
  7.         public static void main(String[] args) {
  8.                 System.out.println(Arrays.toString(getMaxProbability1(5000)));
  9.         }
  10.         public static int[] getMaxProbability1(int n){//
  11.                 int count=0;
  12.                 int maxNum=1;
  13.                 int tempCount=0;
  14.                 int[] maxBall=new int[BALLNUM];//存储最大机率的那组球
  15.                 int[][] ball=new int[n][BALLNUM];
  16.                 int[][] pbby=new int[BALLNUM][n];
  17.                 for(int i=0;i<n;i++){
  18.                         ball[i]=getDoubleBall();//取n注球
  19.                         for(int j=0;j<BALLNUM;j++)
  20.                                 pbby[j][i]=ball[i][j];
  21.                 }
  22.                 for(int i=0;i<BALLNUM;i++){
  23.                         Arrays.sort(pbby[i]);
  24.                         System.out.println(pbby[i]);//这里输出一个数组元素,可以观察.但是我不明白.为什么超过1000似乎就变成6列...
  25.                 }
  26.                 for(int i=0;i<BALLNUM;i++){//找出机率最大的一组球;
  27.                         maxNum=pbby[i][0];
  28.                         for(int j=1;j<n;j++){
  29.                                         if(maxNum==pbby[i][j]){
  30.                                                 count++;
  31.                                                 if(tempCount<count){
  32.                                                         tempCount=count;
  33.                                                         maxBall[i]=maxNum;
  34.                                                         
  35.                                                 }
  36.                                         }
  37.                                         else {
  38.                                                 maxNum=pbby[i][j];
  39.                                                 count=0;
  40.                                         }
  41.                         }
  42.                         count=tempCount=0;
  43.                 }
  44.                 return maxBall;
  45.         }
  46.         public static int[] getDoubleBall(){
  47.                 int[] arr=new int[7];
  48.                 for(int i=0,scope=33;i<arr.length;i++){
  49.                         if(i==arr.length-1)
  50.                                 scope=16;
  51.                         arr[i]=new Random().nextInt(scope)+1;
  52.                 }
  53.                 return arr;
  54.         }
  55. }
复制代码

作者: 陈圳    时间: 2013-4-17 10:25
如果你们老师,有好的答案,希望你把那个答案分享一下.这道题牵扯的数据量较大,希望能有一种较优的算法来实现.
作者: 陈圳    时间: 2013-4-17 10:26
殇_心。 发表于 2013-4-17 09:54
哥们,代码是在你基础上改的。你看看吧```  我觉得选数字不是这么回事吧?

import java.io.*;

你这个...实现了找出最大根据的球球?...
作者: 殇_心。    时间: 2013-4-17 10:30
陈圳 发表于 2013-4-17 10:26
你这个...实现了找出最大根据的球球?...

题目要求是找出概率出现最大的七个数```  
作者: m6281838    时间: 2013-4-17 11:02
陈圳 发表于 2013-4-17 10:25
如果你们老师,有好的答案,希望你把那个答案分享一下.这道题牵扯的数据量较大,希望能有一种较优的算法来实现 ...

嗯。好的。我们老师是做出来了的,但是没有公布他的代码,叫我们自己想想有没有其他的方法。
作者: m6281838    时间: 2013-4-17 11:09
殇_心。 发表于 2013-4-17 09:54
哥们,代码是在你基础上改的。你看看吧```  我觉得选数字不是这么回事吧?

import java.io.*;

这程序我运行了一下,有很多错误啊~~肿么回事 ?

作者: 殇_心。    时间: 2013-4-17 11:18
本帖最后由 殇_心。 于 2013-4-17 11:22 编辑
m6281838 发表于 2013-4-17 11:09
这程序我运行了一下,有很多错误啊~~肿么回事 ?

这是因为我把代码发出去之后  不知道为什么就改变了我代码。
现在应该可以了。刚开始我不知道怎么添加代码。。。请见谅。
  1. import java.io.*;
  2. import java.util.*;

  3. public class Main extends RuntimeException
  4. {
  5.          public static void main(String[] args)throws IOException//代码在是你的基础上改的
  6.          {
  7.                  int[] sum = new int[35];//这个数组用来保存数字的个数
  8.                  for( int i = 0; i < 35; i++ )//把数组进行初始化为0;
  9.                  {
  10.                          sum[i] = 0;
  11.                  }
  12.                  for( int j = 0; j < 5000; j++ ) //运行5000次
  13.                  {
  14.                          int red = (int) (Math.random() * 16 + 1); //选红球
  15.                          sum[red]++;//把红球数字也累加。
  16.                         
  17.                  int[] arr = new int[6];
  18.                  for (int i = 0; i < arr.length; i++) //选蓝球
  19.                  {
  20.                          arr[i] = (int) (Math.random() * 33 + 1);
  21.                          sum[arr[i]]++; //把数字的个数累加
  22.                  }
  23.                 // System.out.print("蓝球:");
  24.                 // for (int i = 0; i < 6; i++) {
  25.                     //     System.out.print(arr + " ");
  26.             
  27.                //  System.out.println("\n红球:" + red);
  28.                
  29.                  }
  30.                  int[] tmp = new int[36];//定义一个数组,用来存储每个数字的位置
  31.                  for( int i = 0; i <= 35; i++ )
  32.                  {
  33.                          tmp[i] = i;
  34.                  }
  35.             int t, q;//为了进行排序,定义的2个中间临时变量
  36.             for( int i = 0; i < 35; i++ ) //选择排序
  37.                     for( int j = i+1; j < 35; j++ )
  38.                     {
  39.                             if( sum[i] > sum[j] )
  40.                             {
  41.                                     t = sum[i]; q = tmp[i];
  42.                                     sum[i] = sum[j]; tmp[i] = tmp[j];
  43.                                     sum[j] = t;  tmp[j] = q;
  44.                             }
  45.                     }
  46.              for( int i = 34; i > 27; i-- )//输出7个数字
  47.              {
  48.                      System.out.print(tmp[i]+",");
  49.              }
  50.                  System.out.println("");
  51.          }
  52. }
复制代码

作者: 陈圳    时间: 2013-4-17 11:31
m6281838 发表于 2013-4-17 11:02
嗯。好的。我们老师是做出来了的,但是没有公布他的代码,叫我们自己想想有没有其他的方法。 ...

现在可以了,我修改过,开始是没有测试.
作者: m6281838    时间: 2013-4-17 11:46
殇_心。 发表于 2013-4-17 11:18
这是因为我把代码发出去之后  不知道为什么就改变了我代码。
现在应该可以了。刚开始我不知道怎么添加代码 ...

额...你这个代码好像没有达到我的要求。运行5000次,选7个概率最大的数,分别为1个概率最大的红球和6个概率最大的篮球,那么红球和篮球的5000次不能在同一个for循环类,它们应该是分开的。
作者: m6281838    时间: 2013-4-17 11:50
陈圳 发表于 2013-4-17 10:22

运行过后也显示有异常;

X$]GVDEQH8AEY4UCMIH%RW4.jpg (94.63 KB, 下载次数: 2)

X$]GVDEQH8AEY4UCMIH%RW4.jpg

作者: m6281838    时间: 2013-4-17 11:51
陈圳 发表于 2013-4-17 10:22

显示的异常是这个图:


作者: 陈圳    时间: 2013-4-17 12:01
m6281838 发表于 2013-4-17 11:51
显示的异常是这个图:

我的方法不如另外一个人的高效,思路不好.你这个问题是文件名与我的class名不一致.改一下就行了.建议你用那个方法
作者: 余勇    时间: 2013-4-17 15:12
我也没想出更好的方法,不过我发现,排序前,需要将数组复制一份,不然排序后你就无法得到具体对应的球了,也就是num
作者: 殇_心。    时间: 2013-4-17 15:13
m6281838 发表于 2013-4-17 11:46
额...你这个代码好像没有达到我的要求。运行5000次,选7个概率最大的数,分别为1个概率最大的红球和6个概 ...

你稍微改一下就行了嘛。。
哥们。 服了。
作者: 黄玉昆    时间: 2013-4-18 20:17
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢




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