C++ 有人知道为什么这个代码不起作用吗
对我来说这是有道理的,但我也不是一个专家。所以我正在为我的第一门编程课程做一个项目,我整天都被这个问题困扰着,我可能已经做了5个小时的累积研究,试图弄清楚这是怎么可能的 基本上,我需要洗牌来进行记忆游戏,我不明白为什么它不起作用。程序运行正常,但图像没有变化。我把cout放在那里只是为了确保每次值都在变化,我只是不知道为什么它不会与那些值交换。我尝试了shuffle和random_shuffle,但我很可能做得不对,如果有人能告诉我我的代码应该是什么样子,我将非常感激。我真不明白为什么它不起作用。如果有人能提供一个工作的例子来解释我哪里出了错,那将是令人惊讶的C++ 有人知道为什么这个代码不起作用吗,c++,random,shuffle,C++,Random,Shuffle,对我来说这是有道理的,但我也不是一个专家。所以我正在为我的第一门编程课程做一个项目,我整天都被这个问题困扰着,我可能已经做了5个小时的累积研究,试图弄清楚这是怎么可能的 基本上,我需要洗牌来进行记忆游戏,我不明白为什么它不起作用。程序运行正常,但图像没有变化。我把cout放在那里只是为了确保每次值都在变化,我只是不知道为什么它不会与那些值交换。我尝试了shuffle和random_shuffle,但我很可能做得不对,如果有人能告诉我我的代码应该是什么样子,我将非常感激。我真不明白为什么它不起作用
void shuffle(int board[][NCOLS]) {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(1, 6);
for (int i = 0; i < 20; i++) {
int randomX = dis(gen);
swap(board[randomX][randomX], board[randomX][randomX]);
cout << "num = " << randomX << endl;
}
}
我使用shuffleboard调用函数是正确的;对的这很奇怪,因为已经有一个内置函数叫做shuffle correct?主要原因是swapboard[randomX][randomX]、board[randomX][randomX];如果您试图将一个板对角元素与其自身交换,则什么也不做。这导致了一个不变的董事会
首先,您需要选择两个随机元素,您需要为数组中每个元素的行和列选择随机变量,或者,正如您在示例中所做的那样,您将只选择矩阵对角线中的元素,这些元素具有相等的行和列ID,因此:
for (i = 0; i < 20;) {
int randXA = dis(gen), // I'll suppose this does the right work
randYA = dis(gen),
randXB = dis(gen),
randXB = dis(gen);
if (randXA != randXB || randYA != randYB) {
/* we have two distinct elements. */
swap(board[randXA][randYA], board[randXB][randYB]);
/* we need to increment i conditionally or we can
* finish with less than 20 swaps. */
i++;
} /* if */
} /* for */
你希望swapboard[randomX][randomX]、board[randomX][randomX]能带来什么;要做什么?一旦你让这段代码工作起来,你应该知道它仍然不是一个完美的洗牌。看,我期望swapboard[randomX][randomX],board[randomX][randomX];要填充随机值,交换它们,然后做20次以洗牌“卡”,您正试图将数组中的一个元素与其自身交换,因此在endswap中没有执行任何操作,但没有可见的效果。我怎么看不到…我不太确定这种统一分布是如何工作的,有没有可能我可以让另一个随机数说randomY然后用它呢?或者randomX和randomY是一样的?
int randXA = rand() % MAXX,
randXB = rand() % MAXX,
randYA = rand() % MAXY,
randYB = rand() % MAXY;