1

我被要求编写一个生成 2d 随机数数组的程序。我的代码产生了奇怪的结果。不管矩阵的大小如何,它都会产生一个“反向对角矩阵”(不知道还能叫什么)。我要理解 rand() 会产生一个介于 0 和 RAND_MAX 之间的伪随机数,但不知何故,结果取决于我的矩阵的大小,我不确定这种行为是如何发生的。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAT_SIZE 5

void main (void)
{

srand(time(0));

unsigned char * ptr = malloc(MAT_SIZE*MAT_SIZE);
unsigned char i, j;

for(i = 0; i < MAT_SIZE; i++)
{
    for(j = 0; j < MAT_SIZE ; j ++)
    {

        *(ptr + i + j ) = rand();
    }
}
 for(i = 0; i < MAT_SIZE ; i++)
{
    for(j = 0; j < MAT_SIZE ; j ++)
    {
        printf("%5d", *(ptr + i + j));
    }
    printf("\n");
}
    free(ptr);
}

3*3输出

142  141   11
141   11  230
11   230   28

输出5*5

232  157   62  131  245
157   62  131  245   54
 62  131  245   54  138
131  245   54  138  246
245   54  138  246  108

即使是伪随机数也不应该根据其使用方式而有所不同。我对强制这些结果的程序有什么不理解吗?

4

3 回答 3

8

问题不在于生成的随机数,而在于您如何将它们保存在矩阵中。(j, i)访问您不想要的元素

*(ptr + i + j )

*(ptr + MAT_SIZE * i + j )
于 2013-09-12T18:04:31.573 回答
2

您只访问i+j数组的第一个成员,并重复循环相同的索引。代替:

*(ptr + i + j )

尝试

*(ptr + i * MAT_SIZE + j )

于 2013-09-12T18:05:41.717 回答
0

请注意,您可以按如下方式动态分配二维数组:

unsigned char (*ptr)[MAT_SIZE] = malloc( MAT_SIZE * sizeof *ptr );
...
ptr[i][j] = rand();
...
free( ptr );

让生活变得简单一些。这样您就可以使用普通的 2D 数组索引,而不必映射ij单个维度。

尼特:

除非您的编译器文档明确列出void main()的有效签名main,否则请int main( void )改用。我知道您已经void main()在书籍和网上看到了数千个示例,但仅仅因为编译器没有抱怨它并不意味着它没有错。

rand()返回int,它不适合unsigned char. 无符号类型的溢出是明确定义的,但即便如此,您可能希望将rand结果显式映射到范围 [0..255]。

于 2013-09-12T19:33:31.867 回答