【问题标题】:Creating a random ordered list from an ordered list从有序列表创建随机有序列表
【发布时间】:2010-09-15 03:29:57
【问题描述】:

我有一个应用程序可以获取制造过程的质量结果,并且 创建图表以显示不良的 Pareto 图,并显示生产吞吐量。

为了自动化测试这些统计程序的任务,我希望能够确定地将记录添加到数据库中,并让质量技术人员查看某些图表并与已知的良好图表进行比较。但是,我还想模拟结果,以便它们进入数据库,就像用户正在运行测试过程一样。

我的一个想法是用 i 编号好的、j 编号的 bad1、k 编号的 bad 2 等填充列表。然后在插入数据库之前以某种方式随机排序列表。

那么,我的问题是,是否有一个标准算法来获取一个排序的值列表并创建一个随机排序的列表?

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    您需要使用shuffle algorithm. 确保使用正确的随机播放算法,而不是自制算法,因为它可能会在数据中引入某种形式的微妙模式。见this post by Jeff Atwood about the problem with using "random enough" shuffles.

    【讨论】:

    • 哇!应该想到了shuffle算法。谢谢。
    【解决方案2】:

    一个简单的答案是有一个数组或向量,循环一次,对于访问的每个位置,从列表的其余部分中随机选择一个元素并将其与当前元素交换。
    为此,您需要一个合理的随机数生成器。

    【讨论】:

    • 请注意,对于奇数大小的列表,这只会生成原始顺序的奇数排列,而对于偶数大小的列表,只会生成偶数排列。你通常不在乎,但如果你在乎,你可能会很在乎。通过允许“与自己交换”来修复它。结果仍然是有偏差的输出,但是是满射的。
    • 好的,我明白了。所以从列表的其余部分中随机选择,或者选择它本身并执行交换。
    【解决方案3】:
    Random rnd = new Random();
    List<int> orderedList = new List<int>();
    List<int> randomList = new List<int>();
    while (orderedList.Count != 0)
    {
        int index = rnd.Next(0, orderedList.Count);
        randomList.Add(orderedList[index]);
        orderedList.RemoveAt(index);
    }
    

    【讨论】:

      【解决方案4】:

      取决于您对“随机性”的需求。最简单的方法可能只是将所有元素放入一个哈希集中并迭代结果。您获得的顺序将是确定性的,但对于大多数意图和目的而言,可以认为是随机的。或者,您可以在列表的 [0..length] 之间生成随机数,挑选出元素并将它们推送到新列表中。假设列表删除是常数时间,结果将是一个以 O(n) 效率生成的随机列表。

      【讨论】:

        【解决方案5】:

        我以前这样做的方法是让一个循环运行多次,生成介于 0 和列表长度之间的两个随机数,然后交换这两个元素。

        【讨论】:

        • 正确的做法是 Fisher-Yates/Knuth 洗牌。在维基百科上查看。
        【解决方案6】:

        楼主有一篇关于洗牌的文章很不错,相信有一些好的想法可以采纳
        http://www.codinghorror.com/blog/archives/001008.html

        【讨论】:

        • 那是一篇糟糕的文章,它一开始是正确的,Fisher-Yates/Knuth shuffle,然后尝试使用 guid 作为随机源进行随机排序,结果出现了可怕的错误。不要浪费时间,只需阅读有关 Fisher-Yates 的 Wikipedia 文章或使用正确实现 shuffle 的库即可。
        猜你喜欢
        • 2013-04-04
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        相关资源
        最近更新 更多