所以我有一个卡片矢量,我正在尝试使用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。
答案 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);
}
您说“不工作”的技术工作正常,因此您的程序问题不在您向我们描述的内容中。