【问题标题】:Collections.shuffle(List list)Collections.shuffle(列表列表)
【发布时间】:2010-05-31 06:45:15
【问题描述】:

什么会促使人们使用这种方法?

更新:我现在明白了。我喜欢 Uri 的原因“洗牌不是一个简单的算法”。确实如此。

【问题讨论】:

    标签: java collections shuffle


    【解决方案1】:

    想要随机打乱有序的元素序列可能有很多原因。例如,一副纸牌。

    洗牌不是一个简单的算法,就像排序不是 - 所以它很常见,需要一个库函数。

    至于为什么是一个列表——显然它必须是一个有序的集合,因此不是任何一般的集合。只有 list 及其子类型保证是有序的。 Collections 类不提供数组操作,但您可以(并且可能应该,为了性能)将 ArrayList 传递给此方法。

    【讨论】:

    • ...实际上实现非常简单。每个元素都有一个新的索引,如果槽已经被占用,集合(或迭代器)计算下一个空闲槽。
    • @Andreas_D 不要小看它,你必须小心使用所有排列可能性相同的算法,所以它不是完全微不足道的 - 请参阅en.wikipedia.org/wiki/Fisher-Yates_shuffle
    • ... 只是查看了 Collections 中的实际实现。那里很容易解决。但可能不是最优的。
    • 我在求职面试中看到了排列算法,所以它绝对不是微不足道的。即使我知道如何编写快速排序,我也使用 Collections.sort() :)
    【解决方案2】:

    嗯,如果你有一个收藏,并且想要随机播放它...

    最明显的例子是纸牌游戏,其中有代表单张纸牌的对象,以及代表要洗牌的牌组的集合。

    另一个示例可能是,如果您在问卷中向用户提供多个答案,并且您不希望由于答案的顺序而出现任何偏差 - 所以您向每个用户提供一组打乱了的答案从中挑选。

    【讨论】:

      【解决方案3】:

      好吧,假设您正在为一副纸牌建模。 Shuffle 将是您首先编写的函数之一。

      任何时候您想要随机化集合的内容,都可以使用随机播放。

      【讨论】:

        【解决方案4】:

        如何使用此方法的一些想法:

        • 在游戏中洗牌
        • 在排序算法的测试用例中随机化一个数组
        • 改组测试套件中的测试用例,确保它们不相互依赖
        • 如果您尝试解决像旅行商这样的 NP 完全问题,一种方法是获取输入,将其洗牌几次,然后使用长度最短的结果。这为您提供了一个在 O(N) 时间内运行的解决方案(其中 N 是节点数)。

        【讨论】:

          猜你喜欢
          • 2015-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-29
          • 2022-09-27
          • 2016-01-26
          • 1970-01-01
          相关资源
          最近更新 更多