【问题标题】:random_shuffle not allowing me to pass it a seedrandom_shuffle 不允许我传递种子
【发布时间】:2014-02-08 22:35:03
【问题描述】:

所以我有一个卡片向量,我正在尝试使用 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 的例子。

【问题讨论】:

  • 您是否遇到任何类型的编译错误?像类型错误?
  • Seestd::random_shuffle的函数对象条件
  • 我只是快速安装英文版的VS2012,然后我会发布编译器错误
  • 好的,我已将它们添加到我的帖子中。
  • 你没有创建SSCCE,所以I made one for you and it works fine

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


【解决方案1】:

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

【讨论】:

  • 好吧,将其设为静态会使程序编译,但不会打乱向量
  • enemyCards 和 playerCards 的 begin 和 end 方法是自定义的吗?还是直接来自 STL 容器?
  • 这些是向量的 begin() 和 end() 方法
  • 您是否碰巧为您的向量中使用的 Card 类提供了自定义交换功能?
  • 不,没有任何可以干扰的
【解决方案2】:

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

你说“不工作”的技术工作正常,所以你的程序的问题不在于你向我们描述的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2017-12-25
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多