Java:具有随机整数和输入计数的数组的min方法

时间:2015-04-06 18:41:06

标签: java arrays random statistics minimum

完整的任务是创建许多方法,例如getMode和getAverage,用于计算具有随机生成的数字和用户输入的最大上限,最小值和样本大小的数组的统计信息。我的所有其他方法似乎都有效,但每次我尝试返回填充集的最小值时,我得到0 - 即使输入的分数更高。

这是我的代码:

import java.util.Random;

public class Stats extends Main
{
int sampleSize;
double count;
double ave;
double sum;
int mode;
int evenCount;
int oddCount;
int countMatching;
int counter;
int target;
int match;

//Method: return the sample set's max value
public int getMax(int sampleSize, int[] data)
{
    int max = Integer.MAX_VALUE;
    max = data[0];
    for(int i = 0; i < sampleSize; i++)
    {
        if (data[i] > max)
            max = data[i];
    }
    return max;
}
//Method: return the min value
public int getMin(int sampleSize, int[] data)
{
    int min = Integer.MIN_VALUE;
    min = data[0];
    for(int i = 0; i < sampleSize; i++)
    {
        if (data[i] < min)
            min = data[i];
    }
    return min;
...

主程序:

import java.util.Random;
import java.util.Scanner;

public class Main 
{
public static void main(String[] args) 
{
    int stats;
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Welcome to the Stats Program!");
    System.out.println();
    System.out.println("Enter sample size: ");
    int sampleSize = keyboard.nextInt();
    System.out.println();
    System.out.println("What is the sample set's minimum? ");
    int min = keyboard.nextInt();
    System.out.println();
    System.out.println("What is the sample set's maximum? ");
    int max = keyboard.nextInt();
    System.out.println();

    Stats g = new Stats();
    System.out.println("Main Menu");
    System.out.println();
    System.out.println("1) Get max value");
    System.out.println("2) Get min value");
    System.out.println("3) Get the mean");
    System.out.println("4) Get the mode");
    System.out.println("5) Get the count of even numbers");
    System.out.println("6) Get the count of odd numbers");
    System.out.println("7) Display the sample set");
    System.out.println("8) Return the count of numbers in the sample set  that match the input parameter");
    System.out.println("9) Exit");
    System.out.println();
    stats = keyboard.nextInt();

    //Constructor: use an RNG to generate sampleSize integers between        minValue and maxValue. Store the numbers in an array named 'data'.
    int[] data = new int[sampleSize];
    for (int i = 0; i < sampleSize; i++)
        {
            Random rand = new Random();
            data[i] = rand.nextInt((max - min + 1) + min);
        }

    while (stats != 9)
    {
        if (stats == 1)
        {
            g.getMax(sampleSize, data);
            System.out.println("Max is: " + g.getMax(sampleSize, data));
            System.out.println();
        }
        else if (stats == 2)
        {
            g.getMin(sampleSize, data);
            System.out.println("Min is: " + g.getMin(sampleSize, data));
            System.out.println();
        }
        ...

知道为什么我的程序没有返回适当的最小值(等于或高于用户输入的值)?最大值似乎很好 - 有时它低于用户输入的最大值,并且通常它是相等的。我已经看过其他问题了。 min / max和具有随机数的数组,但无法将其解决方案应用于我自己的问题。

提前致谢!

3 个答案:

答案 0 :(得分:0)

您的min方法似乎运行良好,可能您的数组中没有小于0的数字。

这个答案并不完全是为了让你的实际方法有效,但只是建议一个更简单的方法来做到这一点。

您可以使用CollectionsCommons Lang来查找数组的最小值/最大值,并将基本数组转换为List。

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;

public class tst {
    public static void main(String[] args) {
        int[] arr = {1, 23, 43, 2, 4, 5, 5, 1, 2, 3};

        List lst = Arrays.asList(ArrayUtils.toObject(arr));

        System.out.println(Collections.min(lst));
        System.out.println(Collections.max(lst));
    }
}

这将输出min:1max:43

如果你不被迫使用原始数组并自己做所有事情,这是一个很好的解决方案。

希望有所帮助:)

答案 1 :(得分:0)

请随机更改nextInt函数,了解如何获得随机值。 它应该是

data[i] = rand.nextInt(max - min + 1) + min;

不是data[i] = rand.nextInt((max - min + 1) + min);

答案 2 :(得分:0)

查看代码的这一部分:

for (int i = 0; i < sampleSize; i++)
    {
        Random rand = new Random();
        data[i] = rand.nextInt((max - min + 1) + min);
    }

首先,错误的是你在每次迭代中创建一个新的随机数生成器 。你应该在循环之前创建它,然后在循环中使用它。

但那不是那么重要的问题。更重要的是你运行rand.nextInt()的方式。假设您的min为3而max为7.然后(max - min + 1) + min会给您8.这意味着您正在调用rand.nextInt(8),这将为您提供一个数字0 ≤数量&lt; 8。

方法Random.nextInt(int n)返回一个数字,使得0≤number<0。 ñ。因此,如果你想要一个3≤x≤1的数字。 8,你需要它给你0到5之间的东西,然后把它加到3.这意味着:

rand.nextInt(max - min + 1) + min;

它看起来像你写的几乎,但额外的一对圆括号完全不同。你不能把括号括在任何地方。方法名称后面的第一个括号定义了方法的参数,在您的情况下,它导致+ min成为nextInt参数的一部分。


还有一件事:你的班级延伸Main。他们没有任何关联,您的Stats不是Main,对吧?