有没有一种方法可以生成随机方阵,直到出现一个对称方阵? (C)

Is there a way to generate random square matrixes until there is one that is symmetric? (C)

我需要做的是在内部创建一个3>=n>=8行和列的随机矩阵,程序应该这样做直到找到一个对角对称的矩阵,然后打印它,随机数必须从 0 到 7,并且应该有一个功能,可以将变量形式从 true 更改为 false,您可以选择打印或不打印不对称的矩阵。我已经能够创建随机矩阵,直到它是对称的,但仅限于 3x3,上面的任何数字都会让我的电脑永远思考,我确信必须有更有效的方法来做到这一点,但我不是很擅长 c 这是我的代码得到:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int simetria (int n, int matriz[n][n], int transpuesta[n][n]);

int main(void)
{
    setbuf(stdout, NULL);
    srand(time(0));

    int n, r, c, symmetry = 0;

    scanf("%i", &n);

    int matriz [n][n],transpuesta[n][n];

    int contador = ((n*n)-n);

    while(symmetry != contador)
    {
        for(r = 0; r<n; r++){
            for(c = 0; c<n; c++){
                matriz [r][c] = (rand() %8);
            }
        }
        for(r = 0; r<n; r++){
            for(c = 0; c<n; c++){
                transpuesta[c][r] = matriz [r][c];
            }
        }
        symmetry = simetria(n, matriz, transpuesta);

    }
    printf("\n");
    for(r = 0; r<n; r++){
                for(c = 0; c<n; c++){
                    printf("%i \t", matriz [r][c]);
                }
                printf("\n\n");
            }
    return 0;
}

int simetria (int n, int matriz[n][n], int transpuesta[n][n])
{
    int r, c;
    int symmetry = 0;
    for(r = 0; r<n; r++){
                for(c = 0; c<n; c++){
                    if (r!=c){
                        if (transpuesta[r][c] == matriz [r][c]){
                            symmetry++;
                        }
                        else{
                            symmetry = 0;
                            return symmetry;
                        }
                    }
                }
            }
    return symmetry;
}

正在将我的评论转化为答案。

判断矩阵是否关于主对角线对称,只需要检查matrix[r][c] == matrix[c][r]。为了提高效率,您应该确保不检查对角线并且不检查任何东西两次。没有必要像问题中那样创建转置。这将加快比较速度。但最终,随着矩阵变大,随机生成对称矩阵的可能性很小。

如果您有一个 2x2 矩阵,其中每个单元格都包含 0..7 范围内的整数值,则您有八分之一的机会获得关于主对角线对称的矩阵。如果您有一个 3x3 矩阵,概率会下降到 8³ 或 1:512 中的 1,因为对角线上方有 3 个单元格,并且对角线下方的每个对应单元格包含相同值的可能性为 8 分之一。对于 4x4 矩阵,它在 8⁶ 或 1:4096 中下降到 1;对于 5x5,概率在 8¹⁰ 或 1:32767 中下降到 1,依此类推。对于 NxN 矩阵,概率是 8 的 N(N-1)/2 次方。

I haven't thought of a way of only comparing half of the triangle.

for (int r = 0; r < n; r++)
{
    for (int c = r + 1; c < n; c++)
    {
        if (matrix[r][c] != matrix[c][r])
        {
            …asymmetric…
        }
    }
}

如果这是在布尔函数中,您可以使用 return false; 检测不对称性,如果循环完成则使用 return true;。首先比较 matrix[0][1]matrix[1][0].

请注意,如果目标是生成一个对称但随机的矩阵(每个单元格包含 0..7 范围内的整数值,您可以使用类似的循环(但使用 c = r 而不是 c = r + 1) 并使用 matrix[r][c] = matrix[c][r] = rand() % 8;。内循环开始条件的变化也分配给前导对角线。或者您可以避免将两次分配给前导对角线上的元素:

for (int r = 0; r < n; r++)
{
    matrix[r][r] = rand() % 8;
    for (int c = r + 1; c < n; c++)
         matrix[r][c] = matrix[c][r] = rand() % 8;
}