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

C++ - is it possible to generate every single permutation of an array, once and only once, using random_shuffle?

本文关键字:一次 排列 每一个 random 可以使 是否 shuffle 数组 C++-      更新时间:2023-10-16

我的任务是测试一种排序算法,将长度为'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的运作方式?

编辑:

我知道下一个::排列会更有意义。我意识到这使事情过于复杂。但我的老师坚持让我这样做,我不应该得到重复的结果,因为random_shuffle遵循均匀分布;从而与我所读到的包括文档在内的所有内容相矛盾。我使用random_shuffle。我只是想确认一下这个功能的具体行为。即便如此,next_placement也不是随机的。

您必须使用random_shuffle吗?这似乎是该函数的错误算法,因为无法保证实际需要多少次尝试才能获得所有n!不同的排列。更适合的算法是CCD_ 3。如:

 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
}

可能测试所有排列。可能不会。但我觉得你的排序不太可能被打破,也不太可能通过。

在得到重复结果之前,每个排列不太可能生成一次;因此CCD_ 5不是您想要的。对random_shuffle()的每个调用都独立于其他调用。

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