【问题标题】:Collections.shuffle doesn't work as expected with SimClock Random valueCollections.shuffle 对于 SimClock Random 值不能按预期工作
【发布时间】: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()返回的值,并显示洗牌的结果。展示它如何不适合你。
  • 当时间戳作为参数传递时,“预期”的输出是什么?

标签: java random time shuffle


【解决方案1】:

我使用了以下代码:

public static void main(String[] args) throws IOException {
   List<String> arr = new ArrayList<>(3);
   arr.add("aaa");
   arr.add("bbb");
   arr.add("ccc");

   for (int i = 0; i < 4; i++) {
       Collections.shuffle(arr, new Random(System.currentTimeMillis()));
       System.out.println(ArrayUtils.toString(arr));
   }
}

出局:
[ccc, aaa, bbb]
[bbb, ccc, aaa]
[aaa, bbb, ccc]
[ccc, aaa, bbb]

当你在new Random(...) 的参数中输入常量值时,所有的输出都是一样的。

【讨论】:

  • 比问题中的要好。但是,如果您的代码运行得足够快,那么在下一次循环之前可能不会超过一毫秒,您将再次遇到同样的问题。最好在循环外创建一个Random 对象并每次都使用它。如果这是不可能的,第二好的方法是创建 Random 对象而不指定种子:: 只是 new Random()
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 2015-06-26
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多