25

私はこれを読んでいました:http : //www.cplusplus.com/reference/algorithm/random_shuffle/そしてint要素の配列をrandom_shuffleすることが可能かどうか疑問に思いました。これは私のコードです

#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. を使用してint配列をシャッフルすることは可能ですかrandom_shuffle。はいの場合、私はそれを行う方法を学びたいと思います。

  2. random_shuffleテンプレートにのみ適用できますか?

  3. エラーはどういう意味ですか?

4

5 に答える 5

54

要素自体ではなく、a[0]とにポインタを渡す必要があります。a[10]

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

std::beginC ++ 11では、とを使用できますstd::end

random_shuffle(std::begin(a), std::end(a));
于 2013-02-06T01:35:42.053 に答える
3

random_shuffle要素ではなく、イテレータを取ります。次のいずれかを試してください。

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

また

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

std::random_shuffleランダムアクセスイテレータの任意のペアで使用でき、それらのイテレータによって示される範囲の要素をシャッフルします。

intsはイテレータではないため、エラーが発生します。そのため、指定されたsをイテレータとしてstd::random_shuffle使用できません。int

于 2013-02-06T07:01:14.240 に答える
3

交換してみてください

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

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

差出人:http ://www.java2s.com/Code/Cpp/STL-Basics/Userandomshufflealgorithmswitharray.htm

于 2013-02-06T01:41:35.677 に答える
1

arrをポインタに変更するだけでは、解決策は解決されません。これにより、配列が1つのタイプの順列にスワップされます。これは、プログラムを再実行すると、前の実行とまったく同じ方法で配列がシャッフルされることを意味します。

これを修正するために-関数はシードとして機能する3番目のパラメーターを提供します。したがって、関数の正しい実装は次のとおりです。

1)乱数を生成する関数またはlamdaを用意します。これはあなたの種として機能します。

int myrandom (int i) { return std::rand()%i;}

必ず内部乱数発生器のシードを設定してください。

std::srand ( unsigned ( std::time(0) ) );

2)この関数をrandom_shuffle関数呼び出しの3番目の引数として挿入します。

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
于 2017-07-21T09:29:17.423 に答える
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;
}
于 2014-10-17T19:24:16.120 に答える