2013-01-19 76 views
2

我創建了需要與條件產生隨機數的下一個隨機數不匹配這裏的數組中的前一個方法是代碼如何創建一個隨機整數數組產生

// 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:無效指數1,大小爲1

+0

請正確列表代碼;它很難閱讀,我認爲有一個缺失} – Luis

+0

是否因爲你的數組是空的開始? 「如果(randomset.get(j)== randomset.get(j-1)){」 – Zeddy

回答

1

因爲最初randomset是空的,因此它的大小爲0,並在索引1至randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));如果j < 1(補充最好的方法返回異常不> = 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))); 
    }  
} 

}

+0

如果我實現了上述循環條件,lopp將不會因爲插入數據而結束在循環內部,randomset.size會繼續增加。但我只需要99個值。 – user1910290

+0

O修改了我的解決方案。請檢查。 – hmatar

0

不能引用其索引不在邊界[0, size() - 1]ArrayList的元素。通過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] 
0

唐不要使用與您的輸入參數和循環變量相同的變量。

公共無效randomgenerator(INT長度) {

爲(INT J = 0;Ĵ<長度; J ++)...

我不知道我遵循的休息代碼,但這是一個開始。

0

什麼是你的功能?您會收到一個名爲j的參數,然後您重新分配了它嗎? (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; 
}