我已经创建了一个随机化列表的方法:
public <T> List<T> randomize(List<T> list) {
LinkedList<T> randomizedList = new LinkedList<>();
Random random = new Random(list.size());
for (int i = random.nextInt(); i < list.size(); i++) {
randomizedList.add(list.get(i));
}
return randomizedList;
}我传递给这个方法的列表包含了例如五个元素。当我创建Random random = new Random(list.size());时,我希望当我调用random.nextInt()时,它会返回随机整数,这将是列表元素的索引。
但是,当我调用random.nextInt();而不是返回间隔[0, 4]中的数字(我希望返回它)时,它会返回for的值,例如:-349120689。这给了我一个java.lang.IndexOutOfBoundsException: Index: -349120689, Size: 5。
为什么会发生这种情况,以及如何解决?
发布于 2013-02-08 20:24:26
new Random(list.size());这会将随机数生成器的种子设置为list.size();,我建议更改为new Random() (这将根据系统的当前时间为您提供种子)。请改用Collections.shuffle(list)。要进行真正的混洗,您需要“记住”哪些元素已插入或未插入。在伪代码中,您可以执行以下操作:
将原来的列表复制到一个新的列表中,让我们称它为一个新的,空的列表,让我们称它为“"orig"
发布于 2013-02-08 20:24:53
我希望如此,当我调用random.nextInt()时,它会返回一个随机整数,它将是
元素的索引。
您误解了Random(long)构造函数的用途。该构造函数的目的是为列表指定一个种子。你不会想这样做的--这意味着每个大小为5的集合总是以相同的方式进行混洗。
您可以在每次调用nextInt时指定范围。因此,如果您想要一个介于0(包含)和max (不包含)之间的随机数,只需使用:
int value = random.nextInt(max);因此,如果对nextInt()的第一次调用返回2(在一个包含5个元素的列表中),那么您最终将返回一个包含最后3个元素的新列表。我强烈怀疑这不是你想要做的。
顺便说一句,当您想知道为什么一个应用程序接口没有按照您期望的方式运行时,请阅读文档。Random(long)构造函数和Random.nextInt()的文档显然不是您所期望的行为。
发布于 2013-02-08 20:23:41
使用这个
public <T> List<T> randomize(List<T> list) {
LinkedList<T> randomizedList = new LinkedList<>();
Random random = new Random();
for (int i = random.nextInt(list.size()); i < list.size(); i++) {
randomizedList.add(list.get(i));
}
return randomizedList;
}https://stackoverflow.com/questions/14772430
复制相似问题