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

时间:2020-05-05 04:29:45

标签: c arrays matrix random-seed symmetric

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

#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;
}

1 个答案:

答案 0 :(得分:1)

将我的评论转换为答案。

要确定矩阵是否与前导对角线对称,只需检查matrix[r][c] == matrix[c][r]。为了提高效率,您应该确保不要检查对角线并且不要检查任何东西两次。无需像问题中那样创建转置。这样可以加快比较速度。但最终,随着矩阵变大,随机生成对称矩阵几乎是不可能的。

如果您有一个2x2矩阵,每个像元包含的整数值在0..7范围内,则您有八分之一的机会得到关于前导对角线对称的矩阵。如果您有3x3矩阵,则由于对角线上方有3个像元,因此概率降低为8³或1:512,因为在对角线上方有3个像元,而对角线以下的每个对应像元都有相同值的机会是8分之一。如果使用4x4矩阵,则每8英寸或1:4096会下降到1;如果是5x5,则概率降为8或1:32767,以此类推。对于NxN矩阵,将概率提高8到N(N-1)/ 2的幂。

我还没有想到只比较三角形的一半的方法。

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而不是{{1} })并使用c = r + 1。内循环开始条件的变化也分配给前导对角线,或者您可以避免通过以下方式将两次分配给前导对角线上的元素:

matrix[r][c] = matrix[c][r] = rand() % 8;