首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据列表的大小创建Java随机数

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

Stack Overflow用户
提问于 2013-02-08 20:20:15
回答 5查看 2.6K关注 0票数 0

我已经创建了一个随机化列表的方法:

代码语言:javascript
运行
复制
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

为什么会发生这种情况,以及如何解决?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-08 20:24:26

  1. new Random(list.size());这会将随机数生成器的种子设置为list.size();,我建议更改为new Random() (这将根据系统的当前时间为您提供种子)。请改用Collections.shuffle(list)

要进行真正的混洗,您需要“记住”哪些元素已插入或未插入。在伪代码中,您可以执行以下操作:

将原来的列表复制到一个新的列表中,让我们称它为一个新的,空的列表,让我们称它为“"orig"

  • Create”
  • 只要原始列表中有元素,在随机索引中获取一个元素并将其添加到结果列表中。从原始列表中删除所选元素。
  • 返回结果列表。
票数 3
EN

Stack Overflow用户

发布于 2013-02-08 20:24:53

我希望如此,当我调用random.nextInt()时,它会返回一个随机整数,它将是

元素的索引。

您误解了Random(long)构造函数的用途。该构造函数的目的是为列表指定一个种子。你不会想这样做的--这意味着每个大小为5的集合总是以相同的方式进行混洗。

您可以在每次调用nextInt时指定范围。因此,如果您想要一个介于0(包含)和max (不包含)之间的随机数,只需使用:

代码语言:javascript
运行
复制
int value = random.nextInt(max);

因此,如果对nextInt()的第一次调用返回2(在一个包含5个元素的列表中),那么您最终将返回一个包含最后3个元素的新列表。我强烈怀疑这不是你想要做的。

顺便说一句,当您想知道为什么一个应用程序接口没有按照您期望的方式运行时,请阅读文档。Random(long)构造函数和Random.nextInt()的文档显然不是您所期望的行为。

票数 2
EN

Stack Overflow用户

发布于 2013-02-08 20:23:41

使用这个

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14772430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档