поэтому у меня есть вектор карт, и я пытаюсь перетасовать его, используя метод 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.
Делать myrandom
статическая функция-член вашего Game
учебный класс.
Семя не передать 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);
}
Методы, которые вы говорите «не работают», работают правильно, поэтому проблема с вашей программой не в том, что вы нам описываете.