我在下面有这个方法,根据我的JSON条目的大小生成随机数,每个数字只能来一次。我将方法强制转换3次,因为我需要生成3个随机数,它们之间应该是不同的。
有时候它有效,但有时它会在logcat上给我这个错误:错误java.lang.IndexOutOfBoundsException无效位置 这让我的应用程序崩溃了。
有人可以帮我解决问题吗? THX!
int max = prjcts.size();
List<Integer> indices = new ArrayList<Integer>(max);
for(int c = 1; c < max; ++c)
{
indices.add(c);
}
int arrIndex = (int)((double)indices.size() * Math.random());
int randomIndex1 = indices.get(arrIndex);
indices.remove(arrIndex);
int randomIndex2 = indices.get(arrIndex);
indices.remove(arrIndex);
int randomIndex3 = indices.get(arrIndex);
indices.remove(arrIndex);
@KPBird: 所以我改变我的代码就像你告诉我的那样,但它仍然给我错误soemtime: 我错过了什么吗?
Random r = new Random();
int arrIndex = r.nextInt(indices.size());
int randomIndex1 = indices.get(arrIndex);
indices.remove(arrIndex);
int randomIndex2 = indices.get(arrIndex);
indices.remove(arrIndex);
int randomIndex3 = indices.get(arrIndex);
indices.remove(arrIndex);
答案 0 :(得分:5)
问题是indices.remove(...)
从列表中删除条目,并在每次调用时将列表的大小减小1。另一个问题似乎是你试图为每个randomIndexX
获得相同的数组索引,这实际上没有任何意义。
修改:根据我的评论完成示例。这会以随机顺序打印出数字1到N(包括)。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class RandomX {
public static void main(String[] args) {
int start = 1;
int n = 10;
List<Integer> numbers = new ArrayList<Integer>();
for (int i = start; i <= n; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
for (int i = 0; i < n; i++) {
System.out.println(numbers.get(i));
}
}
}
答案 1 :(得分:3)
indices.size() * Math.random()
可能会返回列表的大小。这比最后一个索引多一个。
因此,您应该使用indices.size() - 1
作为最大值。