我被要求编写一个程序,生成一个随机数的二维数组。我的代码产生奇怪的结果。无论矩阵的大小如何,它都会产生“反向对角矩阵”(不知道还有什么可以称之为)。我要理解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
即使伪随机数也不应根据其使用方式而有所不同。是否有一些我不了解强制这些结果的程序?
答案 0 :(得分:8)
问题不在于生成的随机数,而在于如何将它们保存在矩阵中。要访问元素(j, i)
,您不需要
*(ptr + i + j )
但
*(ptr + MAT_SIZE * i + j )
答案 1 :(得分:2)
您只访问数组的第一个i+j
成员,并重复循环遍历相同的索引。而不是:
*(ptr + i + j )
尝试
*(ptr + i * MAT_SIZE + j )
答案 2 :(得分:0)
请注意,您可以按如下方式动态分配2D数组:
unsigned char (*ptr)[MAT_SIZE] = malloc( MAT_SIZE * sizeof *ptr );
...
ptr[i][j] = rand();
...
free( ptr );
让生活变得更简单。这样,您可以使用普通的2D数组索引,而不必将i
和j
映射到单个维度。
尼特:
除非您的编译器文档明确将void main()
列为main
的有效签名,否则请改用int main( void )
。我知道你已经在书中和网上看到了成千上万的{{1}}例子,但仅仅因为编译器没有抱怨它并不意味着没有错。
void main()
会返回rand()
,这不符合int
。无符号类型的溢出是明确定义的,但即便如此,您可能希望将unsigned char
结果显式映射到范围[0..255]。