【问题标题】:for loop in while (building matrix)for 在 while 中循环(构建矩阵)
【发布时间】:2017-12-08 20:56:18
【问题描述】:

它构建矩阵的每个数字[i][j] 并在每个数字之后通过将数字[i][j] 与它之前的数字[k][l] 进行比较来检查。

起初它通过,因为之前没有数字。

真正的目标是制作一个包含所有不同数字的矩阵。 我正在尝试返回开始检查矩阵的数量,以便在遇到相同的蜜蜂时重新开始检查。

(如果数字相同,它会更改数字。更改后,更改的数字也可以与矩阵开头的任何人相同,所以我想在任何更改时再次检查)

int matris[10][10];

int counter = 0;

bool control = true;

for (int i = 0; i<10; i++) {

    for (int j = 0; j<10; j++) {

        matris[i][j] = rand() % 99;
        do {
            for (int k = 0; k <= i; k++) {

                for (int l = 0; l <= j; l++) {
                    if (matris[i][j] == matris[k][l])
                    {
                        matris[i][j] = rand() % 99;
                        counter++;
                       if(k==i&&l==j)break;
                        control = false;
                    } 
                     else control=true;

                }

            }

        } while (control == false);

    }

}

它写入的值是 99-0 还是 100-1 并不重要。我的老师要求我们输入 100-1 之间的数字。

真正的问题是它不能用while来控制。它有时会给出相同的数字。它不应该。

counter = 数字改变了多少次。

这里的结果..

计数器:124 矩阵: 54 68 83 55 12 30 97 96 63 91 52 55 8 6 96 46 55 14 65 93 52 94 39 6 92 40 12 86 66 61 11 33 77 46 97 6 16 28 28 46 17 72 16 75 93 81 61 82 34 19 93 72 96 34 48 49 29 54 81 94 72 27 13 8 22 52 12 96 35 66 87 84 79 10 52 24 45 49 82 48 32 64 34 32 82 85 70 72 97 55 44 93 9 86 10 4 33 25 32 99

你可以看看是否有相同的数字,它的排名。 99 97 97 97 96 96 96 96 94 94 93 93 93 93 92 91 87 86 86 85 84 83 82 82 82 81 81 79 77 75 72 72 72 72 70 68 66 66 65 64 63 61 61 55 55 55 55 54 54 52 52 52 52 49 49 48 48 46 46 46 45 44 40 39 35 34 34 34 33 33 32 32 32 30 29 28 28 27 25 24 22 19 17 16 16 14 13 12 12 12 11 10 10 9 8 8 6 6 6 4 按任意键继续 。 . .

【问题讨论】:

  • 您正在尝试以 100 种方式分配 99 个唯一值。最后一个单元格不可能找到尚未分配的随机值。
  • 因为“kontrol”在第一次迭代后总是假的。
  • 考虑:创建一个从 1 到 100 的数字列表。随机选择其中一个数字,将其分配给您的矩阵,然后从列表中删除该数字。从列表中随机选择另一个数字,将其分配给矩阵,然后将其删除。重复直到矩阵已满。 Fisher-Yates shuffle 的变体。
  • 您没有在内部循环中搜索所有分配的值。想象一下i = 1j = 1。您只会将新值与[0][0] 进行比较,但您已将值分配给元素[0][0][0][9]
  • 这里我实际上是在试图理解为什么不能很好地工作。我接受可以用更好的方式构建矩阵。

标签: c++ for-loop matrix do-while


【解决方案1】:

实际上 do-while 效果很好,但在其中你正在使用 (int k = 0; k &lt; i; k++) 迭代到 i-1 并说如果你把你的第 6 个元素放在你的矩阵中,你只检查第 5 个元素并跳过第 6 个元素.你可以试试(int k = 0; k &lt; i+1; k++)

另一种方法是,如果您希望矩阵中的所有数字 0-99 首先放入它们,然后通过随机交换位置来打乱矩阵...这应该可以解决问题。

#include <iostream>

using namespace std;

int main() {
    int matris[10][10];
    int sayac = 0;

    // put all of them in first
    for (int i = 0; i<10; i++) {
        for (int j = 0; j<10; j++) {
            matris[i][j] = sayac;
            sayac++;
        }
    }

    // then scramble
    for (int i = 0; i<10; i++) {
        for (int j = 0; j<10; j++) {
            int tmp,k ,l;
            k = rand()%9;
            l = rand()%9;
            tmp = matris[i][j];
            matris[i][j] = matris[k][l];
            matris[k][l] = tmp;
        }
    }

    // check the result
    for (int i = 0; i<10; i++) {
        for (int j = 0; j < 10; j++) {
            cout << matris[i][j] << "\t";
        }
        cout << endl;
    }
    return 0;
}

每次您需要使用带有种子(通常是系统时钟)的rand() 函数时查看不同的结果。

【讨论】:

  • k
  • 认为 i=6,j=6 - 你已经填充了 6 行(所有 10 列),现在在第 7 列的第 7 行并放置第 67 个元素;内部循环 k
  • 另一方面 rand() 函数是一个伪随机函数,我的意思是你应该使用 srand() 来代替。
  • 好吧!它有所帮助,计数器增加了。但仍然有相同的数字。
  • 每个代码不必不同。这就是 srand() 的用途。我需要在 1 次编译中使用不同的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2018-01-16
  • 2022-01-09
  • 2016-08-21
相关资源
最近更新 更多