如何以最低的复杂度随机化大约20个元素的顺序? (生成随机排列)
答案 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
。