如何随机化排序列表?

时间:2010-04-22 16:40:31

标签: c++ random theory

这对你们来说是一个奇怪的问题,

我有一个很好的排序列表,我希望随机化。我该怎么做?

在我的应用程序中,我有一个函数返回一个描述离散对象轮廓的点列表。由于问题解决的方式,该函数返回一个很好的有序列表。我有数学中描述的第二个边界,并想确定两个对象是否相互交叉。我简单地对点进行迭代,并确定是否有任何一点在数学边界内。

该方法运行良好但我想通过随机化点数据来提高速度。由于我的数学边界可能会被一系列彼此相邻的点重叠,我认为检查一个随机列表而不是迭代一个好的有序列表是有意义的(因为它只需要一个点击宣布一个十字路口)。

那么,关于如何随机化一个有序列表的任何想法?

6 个答案:

答案 0 :(得分:12)

使用std::random_shuffle。如果您想自己实施该方法,请查看Fisher-Yates shuffle

答案 1 :(得分:4)

您可以尝试random_shuffle algorithm,但请注意,它不适用于list,因为它需要随机访问迭代器。不过,您可以在vectordeque上使用它。

答案 2 :(得分:1)

假设你的“列表”并不意味着链表,而是指支持随机访问的东西(例如,数组,std :: vector或std :: deque),std :: random_shuffle可能很有用。

答案 3 :(得分:1)

但关键问题是随机化列表所需的运行时间是否可能不超过运行时顺序遍历它。

也许你真正需要做的事情实际上并不是随机化它,而是从前到后以某种顺序阅读它。例如,如果列表有n个成员,也许你应该处理1,n,2,n-1,3,n-2等或1,n / 2,2,n / 2 + 1,3,n / 2 +2等

如果您总是拥有相同数量的点数,或者如果点数落入一个小的有限集合中,您可以提前一次为每个可能的点数生成一个点评估顺序,可以是真正随机的,也可能是经过仔细计算的以某种方式。

答案 4 :(得分:1)

int array[N];

for(int i = N - 1; i > 0; i--) {
  int j = rand() % i;
  int tmp = array[i]; array[i] = array[j]; array[j] = i;
}

答案 5 :(得分:-2)

std::random_shuffle(thelist.begin(), thelist.end());