【问题标题】:Shuffling function not working properly洗牌功能无法正常工作
【发布时间】:2016-09-27 16:44:27
【问题描述】:

我创建了一个使用 5X5 数组和向量的洗牌程序。向量应该存储从 1 到 25 的值,并且数组中的每个元素都应该只有 0。一旦传递了 shuffle() 函数,它应该在数组中随机定位向量的 1 到 25 个值。

void Match::shuffle() {

    std::vector<int> vec(25);

    int randNum = rand() % (vec.size());

    for (int i = 1; i < 26; i ++) {
            vec.push_back(i);
    }
    for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
            backArr[i][j] = vec.at(randNum);
            vec.erase(vec.begin() + randNum);

            randNum = rand()%vec.size();
            }
    }

}

【问题讨论】:

标签: c++ arrays vector


【解决方案1】:

为什么不使用 std::random_shuffle ?

【讨论】:

  • 我想避免使用 std:random_shuffle
【解决方案2】:

在最后一次运行中(即在设置 backArr[i][j] 之后),您从向量中删除最后一个元素并计算 randNum = rand()%vec.size();,而 rand() % 0 将失败。

只需在backArr[i][j] = vec.at(randNum); 之前计算randNum(同时删除循环前面的randNum)。

附录:正如@infixed 在 cmets 中指出的那样,您还创建了一个包含 25 个(默认初始化)元素的向量,然后推送 25 个附加元素(因此,我的回答实际上是不正确的)。 为了解决这个问题,您要么需要在声明 vec 时删除 (25),要么将 push_back 指令替换为相应的向量访问(注意 off-by-1)。

【讨论】:

  • 非常感谢,这对您有很大帮助。
猜你喜欢
  • 2017-09-23
  • 2013-11-06
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多