这种方法在做什么? (数组和随机数)

时间:2017-11-16 12:06:38

标签: java arrays random

我的教科书给了我这段代码,以帮助计算某个数字在整数数组中显示的次数。我试图将我的教科书给我的代码应用到我的作业中,但它似乎没有起作用。基本上,我必须在数组中生成30个随机整数,上限为15,下限为-5。

我想知道数组中的数字等于0,1,2 ......一直到10的次数。第一个代码是我的教科书给我的。他们还使用了随机数生成器,但他们想要找出每个数字出现的次数,而不是找到多少个元素等于0,1等。 (得分数组只是随机数生成器,它们的上限是100)。第二个代码是我的。

int[] counts = new int [100];
for (int i = 0; i < scores.length; i++) { 
int index = scores[i]; 
counts[index]++;
}


 //This is my code
 public static void main(String[] args) {
    int []a = arrayHist ();
    printArray (a);
}

public static int randomInt (int low, int high) {
    int range = (high - low) +1;
    return (int) (Math.random() * range) + low;

}

public static int[] randomIntArray (int x) {
    int[] random = new int[x];
    for (int i = 0; i< x; i++) {
        random [i] = randomInt (-5, 15);

    }
    return random;
}

public static int[] arrayHist () {
    int[] counts = new int [30];
    int[] hist = randomIntArray (30);
    for (int i = 0; i < 10 && i >= 0; i++) {
        int index = hist[i];
        counts[index]++;
    }
    return hist;
}


public static void printArray (int[] a) {
    for (int i = 0; i < a.length; i++) {
        System.out.println (a[i]);
    }
}

我应该只获得11个元素,但我会再次获得30个随机数。那是为什么?

2 个答案:

答案 0 :(得分:1)

我会在您的代码中添加一些注释,看看您是否能够发现它出错的地方:

//take a histogram of the array. We're only going to count values between 0 and 10
//so 25th to 75 centiles, ignoring values that are lower than 0 or higher than 10
public static int[] arrayHist () {

  //need to make an array of 11 numbers for the counts
  int[] counts = new int [30];

  //get an array of 30 random numbers
  int[] hist = randomIntArray (30);

  //loop over the whole array of 30 numbers
  for (int i = 0; i < 10 && i >= 0; i++) {
    //retrieve the random number into a variable temporarily
    int index = hist[i];

    //if the value is too low or too high, skip it

    //else, store it in the counts array - the value from the random array
    //serves as the index position in the counts array        
    counts[index]++;
  }

  //return the counts array
  return hist;
}

我对我的评论所做的相当于使用您认为的语言(英语)设计算法,然后您可以将其翻译成您正在学习的语言(java)。很少有开发人员会用他们编写的编程语言来思考。作为一名学生,我建议您在编写评论下面的代码之前,始终要写评论来向自己解释算法。您可以获得写评论的积分(通常),所以如果您先写下评论,那么a)它可以帮助您编写代码; b)您在编写代码后不会有繁琐的写作评论工作

请为了您自己的好/学习,请在查看下面的剧透(答案)之前尝试解决上述问题。将鼠标悬停在框上以显示剧透

  

 //loop over the whole array of 30 numbers - YOU ONLY LOOP 10
 for (int i = 0; i < 10 && i >= 0; i++) {
   //if the value is too low or too high, skip it - YOU DIDN'T DO THIS CHECK
   ...
 }
 //return the counts array - YOU RETURNED THE WRONG ARRAY
 return hist;

对评论做出修改:

检查范围

您必须检查两个限制,因此需要采用以下形式之一:

if(x < 0 || x > 10) then don't do the count

if(!(x >= 0 && x <= 10)) then don't do the count

if(x >= 0 && x <= 10) then do the count

if(!(x < 0 || x > 10)) then do the count

使用NOT的测试 - 感叹号! - 通常难以阅读和理解,因此尽量避免使用它们。测试结果是积极的&#34; - 即他们返回一个积极的结果,而不是一个需要否定的否定 - 更容易阅读和理解。

有关循环和方法的有用提示,就错误检查而言,是测试满足特定条件的错误值,如果遇到错误值,则跳过处理循环的其余部分(使用{{1 }})关键字,或跳过方法的其余部分(通过continue

这样做意味着你的if体({和}之间的位)不会变大。比较:

return

比做更整洁:

for(...){
  if(test for bad values)
    continue;

  //50 lines long loop body
}

如果你使用底部模式,你可以在一个真正的缩进混乱中以几个IF结束,{和}遍布整个地方,你的代码将转到屏幕的右侧:

for(...){
  if(test for goodvalues){
    //50 lines long loop body
  }
}

将缩进级别保持在最低限度有助于使代码更具可读性

因此,我推荐在你的情况下,不是测试0到10范围内的值并用它做某事,而是采用表格&#34;如果值是OUTSIDE&#34;范围0到10,跳过循环的其余部分

答案 1 :(得分:0)

您的arrayHist()方法只返回带有随机数的数组。应该更像这样:

ResultSet.updateString