【发布时间】:2020-02-28 13:14:17
【问题描述】:
我想在我的代码中添加一些随机行为。我想用时间戳值来做。通过这种方式,我想用当前时间戳打乱一个列表。这是我的代码:
Random random = new Random(SimClock.getIntTime());
Collections.shuffle(list, random);
如果我不使用随机变量来随机播放列表,则随机播放可以正常工作。但是,当我使用上面的代码时,输出列表总是相同的(它永远不会被打乱)。
每次调用 Collections.shuffle 时随机值都会发生变化(我检查过),所以我不知道为什么我的列表在使用随机值时没有被打乱。为什么会这样?
更新
list 是一个具有以下值的 ArrayList:[MIX0, MIX1]。
这是在同一执行中调用 3 次 shuffle 时列表和随机变量的值:
randon value: 25214903885
List value before shuffle: [MIX0, MIX1]
List value after shuffle: [MIX0, MIX1]
randon value: 25214903895
List value before shuffle: [MIX0, MIX1]
List value after shuffle: [MIX0, MIX1]
randon value: 25214903865
List value before shuffle: [MIX0, MIX1]
List value after shuffle: [MIX0, MIX1]
随机值是从 Eclipse 变量值复制而来的。
当我使用不带随机值的 shuffle 方法时,有时会以这种方式对列表进行混洗:[MIX1, MIX0]。
【问题讨论】:
-
SimClock让它听起来像一个模拟时钟,所以也许它总是返回相同模拟时间?如果您每次为Random对象播种相同的值,它将始终返回相同的“随机”值序列,这意味着shuffle方法将始终以完全相同的顺序随机播放。 --- 请提供Minimal, Reproducible Example,即显示样本输入list,显示SimClock.getIntTime()返回的值,并显示洗牌的结果。展示它如何不适合你。 -
当时间戳作为参数传递时,“预期”的输出是什么?