我创建了一个方法,它生成随机数,条件是下一个随机数与数组中的前一个不匹配,这里是代码
// 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 :(得分:1)
因为最初的randomset为空,因此其大小为0并在索引1处返回异常。如果randomset.add(0 + (int)(Math.random() * ((99 - 0) + 1)));
(不是&gt; = 1),则添加j < 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)));
}
}
}
答案 1 :(得分:0)
使用
for(j=0; j<randomset.size(); j++){
答案 2 :(得分:0)
您无法引用其索引不在边界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]
答案 3 :(得分:0)
不要使用与输入参数和循环变量相同的变量。
public void randomgenerator(int length) {
for(int j = 0; j&lt; length; j ++)...
我不确定我是否遵循其余的代码,但这是一个开始。
答案 4 :(得分:0)
你的功能是什么?您收到名为 j 的参数,然后重新分配了它?
randomset.get(j)== randomset.get(j-1)&lt; - 在这一行你有一个 java.lang.IndexOutOfBoundsException ,因为你从位置1调用了值但是在你的列表中,你只有0位置的值;所以抛出错误
,这是什么? ((99 - 0)+ 1)),你可以白色100,它很容易,更具可读性
顺便说一句,在这一行你有一个错误, randomset.add(0 +(j,(int)(Math.random()*((99 - 0)+ 1))); < /强>
你应该写一个更干净的代码。
我已经为你准备了一个解决方案:一个生成带有随机数的List并且尊重你条件的函数:两个连续的数字不一样。
您必须使用要生成的元素数量调用此方法 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;
}