繁体   English   中英

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

[英]C++ - is it possible to generate every single permutation of an array, once and only once, using random_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 也不是随机的。

你必须使用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
}

可能会测试所有排列。 可能不会。 但我觉得你的那种人不太可能被打破而这一切都过去了。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM