乱数の 2 次元配列を生成するプログラムを作成するように依頼されました。私のコードは奇妙な結果をもたらします。行列のサイズに関係なく、「逆対角行列」が生成されます (他に何と呼べばよいかわかりません)。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
疑似乱数でさえ、使用方法に基づいて異なる動作をするべきではありません。これらの結果を強制するプログラムについて、私が理解していないことがありますか?