【问题标题】:How to create a random integer array generator如何创建一个随机整数数组生成器
【发布时间】:2013-01-03 08:31:55
【问题描述】:

我创建了一个方法,它生成随机数,条件是下一个随机数与数组中的前一个不匹配这是代码

// some code   

int k=0;

//some code....

randomgenerator(k); // method call

public void randomgenerator(int j)
{

    for(j=0; j<=99; j++){
        if(j >= 1){
            if (randomset.get(j) == randomset.get(j-1)){
                randomset.add(0 + ( j  ,  int)(Math.random() * ((99 - 0) + 1)));
            }
            else{
                randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));
            }
        }       
    }
}

我得到的错误是 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1

【问题讨论】:

  • 请正确列出代码;很难阅读,我认为缺少 }
  • 是不是因为你的数组一开始是空的?然而你试图在这里阅读它......“if (randomset.get(j) == randomset.get(j-1)){”

标签: java android random arraylist


【解决方案1】:

因为最初 randomset 是空的,因此它的大小为 0 并在索引 1 处返回异常。如果 j &lt; 1(不是 >=1),则添加 randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1))); 的最佳方法。

正确代码:

public void randomgenerator(int j)
{
for(j=0; j<=99; j++){
    if(j >= 1){
        if (randomset.get(j) == randomset.get(j-1)){
            randomset.add(0 + ( j  ,  int)(Math.random() * ((99 - 0) + 1)));
        }
        else{
            randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));
        }
    }
    else {
           randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));
    }       
}

}

【讨论】:

  • 如果我实现上述循环条件,lopp 不会结束,因为数据被插入到循环中,所以 randomset.size 会继续增加。但我只需要 99 个值。
  • O 修改了我的解决方案。请检查。
【解决方案2】:

使用

 for(j=0; j<randomset.size(); j++){

【讨论】:

    【解决方案3】:

    不要使用与输入参数和循环变量相同的变量。

    public void randomgenerator(int length) {

    for (int j = 0; j

    我不确定我是否遵循其余代码,但这是一个开始。

    【讨论】:

      【解决方案4】:

      您不能引用ArrayList 的索引不在[0, size() - 1] 范围内的元素。通过ArrayList() 创建ArrayList 会创建一个大小为0 的列表。要将元素添加到此数组,您必须调用添加元素的方法之一,例如add()。您的第一个电话是get(),但列表的大小为0,所以即使get(0) 也会导致IndexOutOfBoundsException

      做什么取决于列表的预期内容。在您的情况下,我建议编写一个辅助函数,该函数在 不包括 指定数字的范围内生成一个随机数。您可以在一个简单的循环中使用该函数来生成整个列表,将前一个元素传递给提到的辅助函数。

      例子:

      public static int randomInRange(int a, int b) {
          return (int)(Math.random() * (b - a + 1));
      }
      
      public static int randomInRangeExcluding(int a, int b, int excluding) {
          int result = (int)(Math.random() * (b - a));
          if (result == excluding) {
              result++;
          }
          return result;
      }
      
      public static List<Integer> generateRandomList(int size) {
          ArrayList<Integer> result = new ArrayList<Integer>();
          for (int j = 0; j <= size; j++) {
              if (j > 0) {
                  result.add(randomInRangeExcluding(0, size - 1, result.get(j - 1)));
              } else {
                  result.add(randomInRange(0, size - 1));
              }    
          }
          return result;
      }
      

      并使用以下方法获取值:

      generateRandomList(100);
      

      调用它会产生一个随机整数列表,其中没有两个连续元素相等:

      [27, 34, 53, 92, 56, 93, 21, 22, 45, 95, 48, 25, 18, 26, 54, 1, 82, 26, 5, 62, 84, 23, 8, 84, 25, 0, 36, 37, 54, 95, 4, 26, 65, 53, 81, 16, 47, 56, 73, 46, 60, 50, 37, 89, 61, 84, 23, 79, 47, 87, 68, 49, 15, 17, 55, 71, 17, 55, 71, 51, 67, 33, 80, 47, 81, 24, 10, 41, 76, 60, 12, 17, 96, 43, 57, 55, 41, 56, 21, 85, 98, 40, 9, 39, 53, 28, 93, 70, 89, 80, 40, 41, 30, 81, 33, 53, 73, 28, 38, 87, 29]
      

      【讨论】:

        【解决方案5】:

        你的职能是什么?您收到一个名为 j 的参数,然后您重新分配了它?

        randomset.get(j) == randomset.get(j-1) java.lang.IndexOutOfBoundsException 因为你从位置 1 调用值但是在你是列表,你在位置 0 上只有一个值;所以抛出一个错误

        还有,这是什么? ((99 - 0) + 1)) 可以白100,简单易读

        顺便说一句,在这一行你有一个错误,randomset.add(0 + ( j , (int)(Math.random() * ((99 - 0) + 1)));

        您应该编写更简洁的代码。

        我已经为您准备了一个解决方案:一个生成带有随机数的列表并尊重您的条件的函数:两个连续的数字不相同。

        您必须使用要生成的元素数量调用此方法generateRandomList

        public static final Integer MAX_RANDOM_NUMBER = 100;
        
        
        public static List<Integer> generateRandomList(int randomNumbers) {
            return generateRandomList(randomNumbers, -1);
        }
        
        private static List<Integer> generateRandomList(final int randomNumbers, final int previousNumber) {
            if (randomNumbers == 1) {
                return new ArrayList<Integer>() {
                    {
                        add(getNextNumber(previousNumber));
                    }
        
                };
            } else {
        
                return new ArrayList<Integer>() {
                    {
                        int value = getNextNumber(previousNumber);
                        add(value);
                        addAll(generateRandomList(randomNumbers - 1, value));
                    }
        
                };
            }
        }
        
        private static int getNextNumber(int previousNumber) {
            boolean generateNewValue = true;
            int currentValue = 0;
            while (generateNewValue) {
                currentValue = (int) (Math.random() * MAX_RANDOM_NUMBER);
                generateNewValue = currentValue == previousNumber;
            }
            return currentValue;
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-11
          • 2023-01-03
          • 1970-01-01
          • 1970-01-01
          • 2012-06-09
          • 2015-05-12
          • 2020-03-09
          • 1970-01-01
          • 2018-04-03
          相关资源
          最近更新 更多