我创建了一种随机化列表的方法:
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]
中的数字(我希望返回)时,它会返回我的值例如:-349120689
。这给了我一个java.lang.IndexOutOfBoundsException:索引:-349120689,大小:5
。
为什么会出现这种情况以及如何解决?
最佳答案
new Random(list.size());
这将随机数生成器的种子设置为list.size();
我建议更改为new Random()
(这将根据系统当前时间为您提供种子)。不过,最好始终重复使用同一个 Random 对象。random.nextInt();
这里是你想要放置random.nextInt(list.size());
的地方,它会给你0 到 list.size() - 1 之间的数字。即使进行了上述更改,您的代码也只会为您提供列表的子列表,从随机索引开始一直到结束。请改用
Collections.shuffle(list)
。
要进行真正的洗牌,您需要“记住”哪些元素 你有没有插入。在伪代码中,你可以这样做 以下:
- 将原始列表复制到新列表,我们称之为“orig”
- 创建一个新的空列表,我们将其称为“结果”
- 只要原始列表有元素,就在随机索引处获取一个元素并将其添加到结果列表中。从原始列表中删除所选元素。
- 返回结果列表。
关于java - 根据列表的大小创建 Java 随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14772430/