有谁知道为什么这段代码不会起作用

时间:2015-04-27 21:43:13

标签: 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;
    }

}

我是否正确使用shuffle(board);正确调用该功能?这很奇怪,因为已经有一个名为shuffle的内置函数正确吗?

1 个答案:

答案 0 :(得分:0)

swap(board[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 */
小心,因为假设dis(gen);正在生成有效数字。如果矩阵不是正方形,则您必须调整为randX<A,B>randY<A,B>具有不同的范围(一个为0..MAXX-1,另一个为0..MAXY-1。在这种情况下,您和#39;我必须使用:

int randXA = rand() % MAXX,
    randXB = rand() % MAXX,
    randYA = rand() % MAXY,
    randYB = rand() % MAXY;