random_shuffle不允许我传递种子

时间:2014-01-19 20:47:35

标签: c++ random vector shuffle random-seed

所以我有一个卡片矢量,我正在尝试使用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(),所以这应该工作正常,它只是没有的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。

2 个答案:

答案 0 :(得分:2)

使myrandom成为Game类的静态成员函数。

答案 1 :(得分:1)

一个没有将种子传递给random_shuffle:可选的第三个参数是一个函数对象,当传递n作为参数时,它必须在[0,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);
}

您说“不工作”的技术工作正常,因此您的程序问题不在您向我们描述的内容中。