【问题标题】:Random Numbers Test (Histogram)随机数测试(直方图)
【发布时间】:2013-11-05 06:41:33
【问题描述】:

我是 Java 编码的新手,我正在尝试使用提供给我的以下方法创建直方图。 cmets 是我们每个方法的指令,我们稍后将使用它来创建主方法并打印直方图。我已经开始使用方法 3 并且能够很好地编译所有内容,但我不确定我是否做得对,我只知道它们正在正确编译到方法 4。我只是不知道该怎么做对于方法 5。 /* 方法一: 查找数组中的最大值 */

public static int max(int[]arr){
    int maxValue = arr[0];
    for ( int i=1; i < arr.length; i++ ){
        if (arr[i] > maxValue){
            maxValue = arr[i];
        }
    }
    return maxValue;
}

/* 
Method 2:
Compute a random integer in the range [a..b)
*/

public static int randomInteger(int a, int b){;
    int randomNum;

    randomNum = a+(int)(Math.random() * ((b-a)+1));
    return randomNum;
}

/* 
Method 3:
Draw a Simple histogram of the array arr.
*/

public static void drawHistogram(int[] arr){
    for ( int i=0; i<arr.length; i++ ){
        System.out.print((i*10+1)+"-"+(i*10+10)+":"+"\t");

        for (int j=0; j<arr[i]; j++)
            System.out.print("*");

        System.out.println();
    }
}

/* 
Method 4:
Compute num random integers in the range [0..range) and put the frequency in arr[]
*/

public static void doSingleTest(int[] arr, int num, int range){
    for (int i=1; i<=num; i++){
        int random = randomInteger(0,range);
        arr[random]++;
    }
}

/* 
Method 5:
Compute num pairs of random integers in the range [0..range) and put the frequency in arr[]
*/

    public static void doPairsTesting(int[] arr, int  num, int range){

   }

public static void main(String[] args) {
    int test[] = new int[]{1,2,3,4,6,11,7};
    System.out.println("method1 = "+ max(test));
    System.out.println("method2 = "+randomInteger(1,20));
    drawHistogram(test);
    doSingleTest(test,1,5);
    System.out.println("method4 = "+Arrays.toString(test));

}

【问题讨论】:

    标签: java methods random compiler-errors histogram


    【解决方案1】:

    这是错误设计int random = int randomInteger(range);我认为你需要阅读docs abot java basics

    我用下一个方法修复了method4:

    public static void doSingleTest(int[] arr, int num, int range){
        for (int i=1; i<=num; i++){
            int random = randomInteger(0,range);
            arr[random]++;
        }
    }
    

    要测试您的方法,请使用下一个主要方法,它将结果打印到控制台,或者您可以在 IDE 中使用调试器:

    public static void main(String[] args) {
        int test[] = new int[]{1,2,3,4,6,11,7};
        System.out.println("mathod1 = "+ max(test));
        System.out.println("mathod2 = "+randomInteger(1,20));
        drawHistogram(test);
        doSingleTest(test,1,5);
        System.out.println("mathod4 = "+Arrays.toString(test));
    
    }
    

    最后你的方法 5 必须返回所需类型的值或者是 void

    public static void doPairsTest(int[] arr, int num, int range){
    
    }
    

    【讨论】:

    • 非常感谢您对方法 4 的帮助。是的,我确实需要阅读更多基础知识,但我迷路了,我什至无法理解这本书。我想向有解释的人学习更容易。另外我在主要方法上遇到错误: RandomNum.java:80: error: cannot find symbol System.out.println("mathod4 = "+Arrays.toString(test)); ^ 符号:变量数组位置:类 RandomNum 1 错误进程 javac 以代码 1 退出
    • 我认为您需要在 imports 中为类添加下一行代码:import java.util.Arrays;
    【解决方案2】:

    对于计算随机整数,您可能需要考虑使用Random 类。这是一些文档:http://docs.oracle.com/javase/6/docs/api/java/util/Random.html

    您可以通过在类中声明一个 Random 对象来做到这一点,如下所示:

    static Random randomGenerator = new Random();
    

    然后在您的每个方法中,您可以使用randomGenerator.nextInt(n),其中 n 将是您希望包含随机数的范围的结尾。 (不包括n,从0开始)。

    对于方法 4,您可能希望将返回类型设置为数组。然后你可以利用这个 randomGenerator,或者给定你当前的代码,你必须将两个参数传递给你的 randomInteger 方法。

    对于方法 5,您可以简单地使用 doSingleTest 方法,然后在返回数组之前将数组的条目除以 2。这是有效的,因为如果您找到两个 3,您的 doSingleTest 在适当位置的频率将为 2。将其除以 2 即可得出对数。此外,您不必担心奇数,因为 Java 中的 int 类型只会丢弃余数。

    我也刚刚注意到您没有为方法 5 设置返回类型,所以继续设置为 int[]

    并使用public static void main(String[] args) 方法来测试您的方法。

    【讨论】:

    • 我刚刚更新了代码,我现在有一个工作方法4。我只是不知道在方法 5 上该怎么做,甚至不知道如何开始它。我在最后一条语句的主要方法上也遇到了错误。
    【解决方案3】:

    对于方法5,你指的是dopairtest吗?如果是这样,这就是我解决这个问题的方法:

    static void doPairsTest(int[] arr3, int num2, int range3){

        for (int i = 0 ; i < num2 ; i++) {
            int rand2 = randomInteger(0, range3);
            int rand3 = randomInteger(0, range3);
            int randomPair = (rand2 * 10) + rand3 ;
            System.out.println(randomPair);
            arr3[randomPair] ++ ;
        }   
    }
    

    如您所见,我刚刚声明并将之前方法中随机生成的值分配到 rand2 和 rand 3 中,然后我将这两个值相加,因此它们加起来是两位数。

    您知道如何制作直方图吗?我很困惑如何根据我们生成的数字和频率来绘制它。

    【讨论】:

      【解决方案4】:
      public static void drawHistogram(int[] arr){
              int n=0;
              for (int i=1;i<=99;i++)
                  if (arr[i]>n)
                      n=arr[i];
              for (;n>0;n--)
              {
                  String r="  ";
                  for (int i=0;i<=99;i++)
                  if (n<=arr[i])
                  {
                      System.out.print(r+"*");
                      r="  ";
                  }
                  else
                      r+="   ";
                  System.out.println();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2021-04-19
        • 2013-07-23
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多