C++ 有人知道为什么这个代码不起作用吗

C++ 有人知道为什么这个代码不起作用吗,c++,random,shuffle,C++,Random,Shuffle,对我来说这是有道理的,但我也不是一个专家。所以我正在为我的第一门编程课程做一个项目,我整天都被这个问题困扰着,我可能已经做了5个小时的累积研究,试图弄清楚这是怎么可能的 基本上,我需要洗牌来进行记忆游戏,我不明白为什么它不起作用。程序运行正常,但图像没有变化。我把cout放在那里只是为了确保每次值都在变化,我只是不知道为什么它不会与那些值交换。我尝试了shuffle和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;