2014-01-19 5 views
1

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

В принципе, у меня есть два векторы, 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() в коде, поэтому это должно работать нормально, это просто случайный случай, который этого не делает.

Это то, что говорит, что компилятор при использовании метода 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.

+2

Вы получаете какую-либо ошибку компиляции? Как ошибка типа? – towr

+0

[См.] (Http://en.cppreference.com/w/cpp/algorithm/random_shuffle) критерии для объекта функции для 'std :: random_shuffle' – P0W

+0

Я просто устанавливаю английскую версию VS2012 в реальном времени, затем Я опубликую ошибки компилятора – zaakun

ответ

2

Сделать myrandom статической функцией члена вашего класса Game.

+0

Хорошо, что делает его статическим, делает программу компиляцией, но она не перетасовывает векторы – zaakun

+0

Являются ли начальные и конечные методы карт врагов и карточек игроков обычными? Или они поступают напрямую из контейнеров STL? – user3146587

+0

Это методы begin() и end() для вектора – zaakun

1

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

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

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

Смежные вопросы