1

カードのベクトルがあり、random_shuffle メソッドを使用してシャッフルしようとしていますが、最初と最後のアイテムを渡すだけではシャッフルされません。したがって、カスタムシードである3番目のパラメーターがあることを知っています。random_shuffleは、これらのパラメーターでオーバーロードされた関数が見つからないことを示しています(またはそのようなもの-私のプログラムはスペイン語です)

基本的に、2 つのベクトル、enemyCards と playerCards があり、どちらもサイズは 5 です。

random_shuffle(enemyCards.begin(), enemyCards.end());
random_shuffle(playerCards.begin(), playerCards.end());

これはコンパイルされますが、動作しません。

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

random_shuffle(enemyCards.begin(), enemyCards.end(), myrandom);
random_shuffle(playerCards.begin(), playerCards.end(), myrandom);

コンパイルさえしません。

私は何か間違ったことをしていますか?

最初に srand() があり、コードに他の作業用の rand() があるので、正常に機能するはずですが、機能しないのは random_shuffle だけです。

これは、 myrandom メソッドを使用するときにコンパイラが言うことです。

Error   11  error C3867: 'comgrid::Game::myrandom': function call missing argument list; use '&comgrid::Game::myrandom' to create a pointer to member
Error   12  error C2780: 'void _STL::random_shuffle(_RandomAccessIter,_RandomAccessIter)' : expects 2 arguments - 3 provided

cplusplus の例のように、実際には 1:1 であるため、これは奇妙です。

4

2 に答える 2

1

オプションの 3 番目の引数は、引数として渡されたrandom_shuffleときに [0,n) のランダムな整数を返さなければならない関数オブジェクトですn。次の SSCCE は、5 つの要素ベクトル ( Coliru でのライブ コードrandom_shuffle) に対する(および「より優れた」C++11 バリアント) の使用を示しています。shuffle

void dump_one(const char* name, vector<int> const& v) {
    cout << name << ": {" << v[0];
    for (auto i = size_t{1}; i < v.size(); ++i) {
        cout << ',' << v[i];
    }
    cout << "}\n";
}

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

int main() {
    srand(random_device{}());
    auto playerCards = vector<int>{1,2,3,4,5};
    auto enemyCards  = vector<int>{6,7,8,9,10};

    // Variant 1: use std::rand
    random_shuffle(begin(playerCards), end(playerCards));
    random_shuffle(begin(enemyCards), end(enemyCards));
    dump_one("player", playerCards);
    dump_one("enemy", enemyCards);

    // Variant 2: use functor
    random_shuffle(begin(playerCards), end(playerCards), myrandom);
    random_shuffle(begin(enemyCards), end(enemyCards), myrandom);
    dump_one("player", playerCards);
    dump_one("enemy", enemyCards);

    // C++11: Use shuffle instead of random_shuffle
    auto engine = mt19937_64{random_device{}()};
    shuffle(begin(playerCards), end(playerCards), engine);
    shuffle(begin(enemyCards), end(enemyCards), engine);
    dump_one("player", playerCards);
    dump_one("enemy", enemyCards);
}

あなたが「うまくいかない」と言っているテクニックは正しく機能しているので、あなたのプログラムの問題はあなたが私たちに説明していることではありません。

于 2014-01-19T21:59:34.253 に答える