是否可以random_shuffle int元素数组?

时间:2013-02-06 01:33:49

标签: c++ algorithm shuffle

我正在读这篇文章: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)'.

我的问题是:

  1. 是否可以使用random_shuffle对int数组进行混洗。如果是,我想学习如何做。

  2. random_shuffle仅适用于模板吗?

  3. 我的错误是什么意思?

5 个答案:

答案 0 :(得分:43)

您需要将指针传递给a[0]a[10],而不是元素本身:

random_shuffle(&a[0], &a[10]); // end must be 10, not 9

在C ++ 11中,您可以使用std::beginstd::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