random_shuffle не позволяет мне передать его семя

поэтому у меня есть вектор карт, и я пытаюсь перетасовать его, используя метод random_shuffle, но он не перетасовывает их, передавая только первый и последний элемент. Так что я знаю, что есть третий параметр, который представляет собой пользовательское начальное число, так как random_shuffle говорит, что не находит функций, перегруженных этими параметрами (или что-то в этом роде — моя программа на испанском языке)

По сути, у меня есть два вектора, карты врага и карты игрока, оба имеют размер 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

Что странно, потому что это действительно 1: 1 в качестве примера на cplusplus.

1

Решение

Делать myrandom статическая функция-член вашего Game учебный класс.

2

Другие решения

Семя не передать random_shuffle: необязательный третий аргумент является функциональным объектом, который должен возвращать случайное целое число в [0, n) при передаче n в качестве аргумента. Следующий SSCCE демонстрирует использование random_shuffle (и «лучший» вариант C ++ 11 shuffle) для ваших 5 элементов вектора (Живой код в Колиру):

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

Методы, которые вы говорите «не работают», работают правильно, поэтому проблема с вашей программой не в том, что вы нам описываете.

1

По вопросам рекламы [email protected]