java - 根据列表的大小创建 Java 随机数

标签 java list random

我创建了一种随机化列表的方法:

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

为什么会出现这种情况以及如何解决?

最佳答案

  1. new Random(list.size()); 这将随机数生成器的种子设置为 list.size(); 我建议更改为new Random()(这将根据系统当前时间为您提供种子)。不过,最好始终重复使用同一个 Random 对象。

  2. random.nextInt(); 这里是你想要放置 random.nextInt(list.size()); 的地方,它会给你0 到 list.size() - 1 之间的数字。

  3. 即使进行了上述更改,您的代码也只会为您提供列表的子列表,从随机索引开始一直到结束。请改用Collections.shuffle(list)

要进行真正的洗牌,您需要“记住”哪些元素 你有没有插入。在伪代码中,你可以这样做 以下:

  • 将原始列表复制到新列表,我们称之为“orig”
  • 创建一个新的空列表,我们将其称为“结果”
  • 只要原始列表有元素,就在随机索引处获取一个元素并将其添加到结果列表中。从原始列表中删除所选元素。
  • 返回结果列表。

关于java - 根据列表的大小创建 Java 随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14772430/

相关文章:

algorithm - 是否可以在保留行和列频率的同时打乱二维矩阵?

java utf-8文件读取

java - 获取http响应代码和所有可用的正文

c# - 使用一些已知类型参数调用泛型方法

javascript - 我的随机链接有问题

java - 在 Java 中带替换的加权采样

java - Drools In Spark 流文件

java - 将数字转换为有效加倍

python - 尝试从从两个函数打印的函数返回一个数据集

python - 从字典列表创建键集