生成元素随机顺序的算法

时间:2009-11-07 01:43:19

标签: algorithm random

如何以最低的复杂度随机化大约20个元素的顺序? (生成随机排列)

4 个答案:

答案 0 :(得分:22)

Knuth's shuffle algorithm是个不错的选择。

答案 1 :(得分:2)

几个月前,我在博客中写到了获取整数列表的随机排列。 您可以将其用作包含元素的集合的索引的排列,然后您就拥有了所需的内容。

在第一篇文章中,我探索了一些可能性,最后我获得了“一个函数来随机排列具有O(n)复杂度的通用列表”,正确封装以处理不可变数据(即,它是无副作用的)

在第二篇文章中,我将其统一分发。

代码在F#中,我希望你不介意!

祝你好运。

编辑:我没有正式的证据,但直觉告诉我这种算法的复杂性不能低于 O(n)。我真的很感激看到它做得更快!

答案 2 :(得分:1)

随机化顺序的一种简单方法是创建一个正确大小的新列表(在您的情况下为20),迭代第一个列表,并将随机位置的每个元素添加到第二个列表。如果随机位置已经填满,请将其放在下一个空闲位置。

我认为这个伪代码是正确的:

list newList
foreach (element in firstList)
    int position = Random.Int(0, firstList.Length - 1)
    while (newList[position] != null)
        position = (position + 1) % firstList.Length
    newList[position] = element

编辑:事实证明,这个答案实际上并不那么好。它既不特别快,也不特别随意。谢谢您的意见。如需一个好的答案,请滚动回页面顶部: - )

答案 3 :(得分:1)

可能有人已经为你实施了洗牌。例如,在Python中,您可以在C ++ random.shuffle和PHP random_shuffle中使用shuffle