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的运作方式?
编辑:
我知道下一个::排列会更有意义。我意识到这使事情过于复杂。但我的老师坚持让我这样做,我不应该得到重复的结果,因为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/
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 如何使用C++一次读取整个二进制文件
- 花括号使循环运行一次?
- C++-是否可以使用random_shuffle生成数组的每一个排列,一次且仅一次
- 数组元素的所有排列在C++中一次获取一定数量的元素