C ++ - 是否可以使用random_shuffle生成一次且只有一次的数组的每个排列?

时间:2014-11-10 22:45:43

标签: c++ arrays random permutation shuffle

我的任务是测试一个排序算法,通过“喂”一次长度'n'的每一个排列。我应该用random_shuffle来做。

我知道random_shuffle遵循统一分布 - 也就是说,每个排列都有相同的生成机会 - 但这并不意味着每个排列都会在得到重复结果之前生成一次,对吗?比如说,如果第一个结果是12345,那就应该花5个!用于random_shuffle得到重复的12345结果。但那不是正在发生的事情。我经常得到重复的结果。这是我正在使用的代码:

#include <cmath>
#include <algorithm>

using namespace std;

int main()
{
int v[5]={1,2,3,4,5}, w[5], cuenta=1;
memcpy(w,v,sizeof v);
srand(time(0));

do {
    random_shuffle(v,v+5);
    for (int j=0;j<5;j++)
        cout << v[j];
    cout << endl;
    cuenta++;
    cout << cuenta << endl;
    } while (memcmp(w,v,sizeof v));
}

我做错了吗?或者这就是random_shuffle的运作方式?

修改

我知道next :: permutation会更有意义。我知道这太复杂了。但是我的老师坚持认为我是这样做的,因为random_shuffle遵循统一的分布,所以我不应该得到重复的结果;因此,与我阅读的所有内容相矛盾,包括文档。我使用random_shuffle。我只是在寻找这个函数的确认/特定行为。即便如此,next_permutation也不是随机的。

2 个答案:

答案 0 :(得分:4)

你必须使用random_shuffle吗?对于此功能而言,这似乎是错误的算法,因为您无法保证实际获得所有n!个不同排列所需的尝试次数。更合适的算法是std::next_permutation。如:

 do {
     // test your sort
 } while (std::next_permutation(v, v+5)); 

使用random_shuffle,您必须实际检查这是否是您之前完成的排列并完成所有这些额外工作,以确保您不会错过任何一个。我的意思是,如果您 将其用于作业,则必须使用它,但我不会尝试:)

[更新]我刚才有一个想法。也许你的老师只是想让你尝试很多不同的排列,不一定都是这些排列?像:

for (int i = 0; i < 1000; ++i) {
    std::random_shuffle(v, v+5);
    // test your sort
}

可能会测试所有排列。它可能不会。但是我觉得这样的事情很可能会被打破,而这一切都要过去了。

答案 1 :(得分:2)

在获得重复结果之前,每次排列都不太可能生成一次。每次调用random_shuffle()都独立于其他调用。每次通话时,某个结果的概率总是相同的。

next_permutation()可能就是你想要的。见http://www.cplusplus.com/reference/algorithm/next_permutation/