我的随机搜索出了什么问题?

时间:2014-01-25 21:07:29

标签: java

我收到错误:“ArrayIndexOutOfBounds Exception3”我不认为这是唯一的错误,但到目前为止,我已经能够弄清楚了。

import java.util.Random;
/*class containing random search algorithm*/
public class RandomSearch {
    public static int randomSearch(int queryValue, int[] list) {
    /*conducts a random search as specified by user*/
    /*trys 10,000,000 random combinations searching
      for user value*/
    int length = list.length;
    for(int i=0; i < 10000000; i++) {
        /*generates a random number from 0 to length*/
        int randomNum = (int)Math.floor(Math.random()*(length+1));
        StdOut.print(randomNum);
        if((int)queryValue == (int)list[randomNum]) {
         return randomNum;
        }
    }
    /*returns -2 if user value not found*/
    return -2;
    }
}

6 个答案:

答案 0 :(得分:2)

你需要这样的东西来生成索引,这使索引在0和长度之间 您生成的索引超出了数组的大小,这就是为什么您将索引超出绑定异常的原因。

/*Edit - Changed val to length to match the question.*/
public int randInt(int length) {

  // Usually this can be a field rather than a method variable
  Random rand = new Random();
  int randomNum = rand.nextInt(length);
  return randomNum;
}

答案 1 :(得分:0)

问题是,randomNum可以获得更大的值,而不是可用于访问数组list的最大索引。

要解决此问题,请更改

int randomNum = (int) (Math.random() * (length + 1));

int randomNum = (int) (Math.random() * (length));

答案 2 :(得分:0)

假设您的list.length长度为100,如果Math.random()返回0.999,则此声明

(int)Math.floor(Math.random()*(length+1));

将返回100。虽然100超出了列表范围,但由于长度为100的数组的有效索引是从099

根据{{​​3}}

答案已更新

答案 3 :(得分:0)

数组索引从0开始,所以当你在数组上调用length()时,最后一个索引实际上是长度 - 1.如果你在list [length - 1]之后尝试任何索引,你将获得Array out of bounds error 。

答案 4 :(得分:0)

尝试使用java.util.Random方法:
Random rand = new Random();
int randomNum = rand.nextInt(lenght+1); 它给出从1到长度的数字。

答案 5 :(得分:0)

标准方法是:

 int randomNum = (int)(Math.random()*length);

您不需要Math.floor(),因为投放到int具有相同的效果。

也只需乘以length(不是length+1,即可获得从0到长度为1的数字。

或者只是使用JDK的API:

int randomNum = new Random().nextInt(length);