【问题标题】:Is it possible to random_shuffle an array of int elements?是否可以 random_shuffle 一个 int 元素数组?
【发布时间】:2013-01-21 02:58:11
【问题描述】:

我正在阅读这个: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. 我的错误是什么意思?

【问题讨论】:

    标签: c++ algorithm shuffle


    【解决方案1】:

    仅将 a​​rr 更改为指针并不能解决解决方案。这将使数组交换为一种排列。这意味着,如果您重新运行程序,您的数组将按照与上次运行时完全相同的方式进行混洗。

    为了解决这个问题 - 该函数提供了第三个参数作为种子。所以该函数的正确实现如下。

    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
    

    【讨论】:

      【解决方案2】:

      以这种方式为我工作:

      #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;
      }
      

      【讨论】:

      • 由于某种原因,这总是以相同的顺序对数组进行洗牌。或者这就是 shuffle 的意义所在?
      • @Koliat 看到格兰特的回答
      • @2br-2b 太棒了,我花了 3 年时间才得到我评论的答复,又花了 6 年时间才被提醒检查评论的答案 :-) 公平地说,2014 年大约是我最后一次接触 C++ :-)
      【解决方案3】:

      尝试替换

      random_shuffle(a[0],a[9]);
      

      random_shuffle(&a[0], &a[10]);
      

      发件人:http://www.java2s.com/Code/Cpp/STL-Basics/Userandomshufflealgorithmswitharray.htm

      【讨论】:

      • 不会是&amp;a[9]吗?
      【解决方案4】:

      您需要传递指向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));
      

      【讨论】:

      • 我知道这听起来很愚蠢,但你怎么知道它的指针??页面的哪一部分是这样说的??
      • @Computernerd,指针是随机访问迭代器,它需要两个迭代器。
      • @ALL another qn: 这个方法调用一次就把所有的数字打乱,有没有什么方法调用时只交换2个数字??
      • @Computernerd, std::swap?
      • @Computernerd 如果您需要交换几个数字以获得另一个随机排列,您可以致电next_permutation。它通常只交换两个项目,但可能会交换更多,或者根本不交换(在这种情况下它返回false)。
      【解决方案5】:

      random_shuffle 采用迭代器,而不是元素。尝试任一:

      std::random_shuffle(a, a + 10);
      

      std::random_shuffle(std::begin(a), std::end(a));
      

      std::random_shuffle 可以用在任意一对随机访问迭代器上,并且会对这些迭代器表示的范围内的元素进行洗牌。

      发生错误是因为ints 不是迭代器,因此std::random_shuffle 无法使用给定的ints 作为迭代器。

      【讨论】:

        猜你喜欢
        • 2020-07-30
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多