我正在读这篇文章:http://www.cplusplus.com/reference/algorithm/random_shuffle/ 并想知道是否可以random_shuffle一个int元素数组。这是我的代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
cout << a << endl << endl;
random_shuffle(a[0],a[9]);
cout<<a;
}
我收到了这个错误:
error C2893: Failed to specialize function template
'iterator_traits<_Iter>::difference_type *std::_Dist_type(_Iter)'.
我的问题是:
是否可以使用random_shuffle
对int数组进行混洗。如果是,我想学习如何做。
random_shuffle
仅适用于模板吗?
我的错误是什么意思?
答案 0 :(得分:43)
您需要将指针传递给a[0]
和a[10]
,而不是元素本身:
random_shuffle(&a[0], &a[10]); // end must be 10, not 9
在C ++ 11中,您可以使用std::begin
和std::end
:
random_shuffle(std::begin(a), std::end(a));
答案 1 :(得分:3)
尝试替换
random_shuffle(a[0],a[9]);
与
random_shuffle(&a[0], &a[10]);
来自:http://www.java2s.com/Code/Cpp/STL-Basics/Userandomshufflealgorithmswitharray.htm
答案 2 :(得分:3)
random_shuffle
使用迭代器而不是元素。尝试:
std::random_shuffle(a, a + 10);
或
std::random_shuffle(std::begin(a), std::end(a));
std::random_shuffle
可用于任何一对随机访问迭代器,并将在这些迭代器表示的范围内对元素进行洗牌。
发生错误是因为int
不是迭代器,因此std::random_shuffle
无法使用给定的int
作为迭代器。
答案 3 :(得分:0)
以这种方式为我工作:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
for (unsigned i = 0; i < 10; i++)
{
cout << a[i];
}
cout << endl;
random_shuffle(&a[0],&a[10]);
for (unsigned i = 0; i < 10; i++)
{
cout << a[i];
}
cout << endl;
}
答案 4 :(得分:0)
将arr更改为指针并不能解决问题。这将使数组交换为一种类型的排列。这意味着如果重新运行程序,您的数组将以与上一次运行完全相同的方式进行洗牌。
为了解决这个问题 - 该函数提供了第三个参数,它充当种子。所以函数的正确实现如下。
1)有一个生成随机数的函数或lamda。这将成为你的种子。
int myrandom (int i) { return std::rand()%i;}
确保设置内部随机数生成器的种子。
std::srand ( unsigned ( std::time(0) ) );
2)在random_shuffle函数调用中插入此函数作为第三个参数。
std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);
这将导致一个随机的随机数组。 请务必包含以下内容:
#include <algorithm> // std::random_shuffle
#include <vector> // std::vector
#include <ctime> // std::time
#include <cstdlib> // std::rand, std::srand