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.


person zaakun    schedule 19.01.2014    source источник
comment
Вы получаете какую-либо ошибку компиляции? Например, ошибка типа?   -  person towr    schedule 20.01.2014
comment
См. критерии объекта функции для std::random_shuffle   -  person P0W    schedule 20.01.2014
comment
Я просто быстро устанавливаю английскую версию VS2012, затем выложу ошибки компилятора   -  person zaakun    schedule 20.01.2014
comment
Хорошо, я добавил их в свой пост.   -  person zaakun    schedule 20.01.2014
comment
Вы не сделали SSCCE, поэтому Я сделал один для вас, и он отлично работает.   -  person Casey    schedule 20.01.2014


Ответы (2)


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

person user3146587    schedule 19.01.2014
comment
Хорошо, если сделать его статическим, программа скомпилируется, но не перемешает векторы. - person zaakun; 20.01.2014
comment
Являются ли методы начала и конца вражеских карт и карт игроков пользовательскими? Или они поступают непосредственно из контейнеров STL? - person user3146587; 20.01.2014
comment
Это методы begin() и end() вектора. - person zaakun; 20.01.2014
comment
У вас случайно нет пользовательской функции подкачки для класса Card, используемого в ваших векторах? - person user3146587; 20.01.2014
comment
Нет, нет ничего, что могло бы помешать - person zaakun; 20.01.2014
comment
Итак, я действительно нашел проблему. Он перетасовывает их, но то, как я их отображаю, все равно показывает их в том же порядке, поэтому, похоже, это не сработало. Так или иначе, основная проблема была решена добавлением статики в функцию - person zaakun; 20.01.2014

Нельзя передавать начальное число в random_shuffle: необязательный третий аргумент является объектом функции который должен возвращать случайное целое число в [0,n) при передаче n в качестве аргумента. Следующий SSCCE демонстрирует использование random_shuffle (и «лучшего» варианта C++11 shuffle) для векторов из 5 элементов (Активный код в 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);
}

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

person Casey    schedule 19.01.2014