随机数测试(直方图)

时间:2013-11-05 06:41:33

标签: java methods random compiler-errors histogram

我是Java编码的新手,我正在尝试使用以下方法创建直方图。注释是我们稍后将用于创建主方法和打印直方图的每个方法的指令。我已经达到方法3并且能够编译所有内容但我不确定我是否正确地执行它们,我只知道它们正在编译正确到方法4.我只是不知道该怎么做对于方法5。     / *     方法1:     在数组中找到最大值     * /

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));

}

4 个答案:

答案 0 :(得分: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]++;
    }
}

为了测试你的方法,使用next main方法,它将结果打印到控制台,或者你可以在IDE中使用Debugger:

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){

}

答案 1 :(得分:0)

对于计算随机整数,您可能需要考虑使用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)方法测试您的方法。

答案 2 :(得分:0)

对于方法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中,然后我添加了其中两个,以便它们加起来为两位数。

你有没有找到如何进行直方图?我很困惑如何基于我们生成的数字和频率来绘制它。

答案 3 :(得分:0)

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();
        }
    }