【问题标题】:How to shuffle an object array in Java如何在 Java 中打乱对象数组
【发布时间】:2014-06-25 14:36:54
【问题描述】:

我想用 Java 实现一个扑克游戏。所以我做了一个卡片类并创建了52个卡片对象并将它们放入一个数组中。这个数组就是卡片组。

如何随机打乱这个对象数组?有没有内置方法或其他方式?

【问题讨论】:

  • 你可以查看这个...stackoverflow.com/questions/1519736/…
  • @Amir 你为什么要那样做?
  • 除非你的数组变量是最终的,cardsArray = Collections.shuffle(Arrays.asList(cardsArray)).asArray(new Card[cardsArray.length]); 应该这样做。

标签: java arrays shuffle


【解决方案1】:

改用ArrayList 并使用Collections.shuffle()

Collections.shuffle(yourListInstance);

【讨论】:

    【解决方案2】:

    我已将“Random shuffling of an array”中的top answer 修改为适用于Card 对象数组。我只是换了int[] arCard[] ar,和int a = ar[index]Card a = ar[index]

    import java.util.*;
    import java.util.concurrent.ThreadLocalRandom;
    
    // Implementing Fisher–Yates shuffle
    static void shuffleArray(Card[] ar)
    {
      // If running on Java 6 or older, use `new Random()` on RHS here
      Random rnd = ThreadLocalRandom.current();
      for (int i = ar.length - 1; i > 0; i--)
      {
        int index = rnd.nextInt(i + 1);
        // Simple swap
        Card a = ar[index];
        ar[index] = ar[i];
        ar[i] = a;
      }
    }
    

    【讨论】:

      【解决方案3】:

      Collections.shuffle 不够好:

      使用默认随机源随机排列指定列表。所有排列都以大致相等的可能性发生。 在前面的描述中使用了“大约”对冲,因为默认随机源只是大约独立选择位的无偏源。如果它是随机选择的比特的完美来源,那么该算法将选择具有完美一致性的排列。

      您需要一个随机源来产生一个完全均匀分布在 1 到 52 之间的数字! (含)。

      【讨论】:

      • 对不起,我不太明白... Collections.shuffle() 到底有什么问题?在我看来,描述只是说使用 PRNG 而不是真正的 RNG,这是有道理的。另外,我并没有完全遵循您的最后一个要求。为什么您需要一个能够准确产生该范围的随机源?
      • 您可以将自己的随机生成器提供给shuffle()
      • 我没听懂你说的。看来他们在Collections.shuffle() 中存在偏见
      • @Daybreaker 一般来说,PRNG 的问题比Collections.shuffle() 本身的问题更大。 Collections.shuffle() 中实现的 shuffle 方法可以是完全随机的,如果你能提供一个真正的 RNG。
      • 如果“随机性来源”(实际上是 PRNG)没有以相等的概率产生每个可能的排列,则 Collections.shuffle() 的结果是有偏差的。引用的 Javadoc 摘录似乎承认 Collections.shuffle() 采取了捷径,例如盲目地将模运算符应用于 PRNG 数字,而不是在必要时拒绝它们,除了没有足够随机地播种 PRNG。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 2014-07-24
      • 2017-10-31
      • 2021-09-25
      相关资源
      最近更新 更多