1

乱数の 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

疑似乱数でさえ、使用方法に基づいて異なる動作をするべきではありません。これらの結果を強制するプログラムについて、私が理解していないことがありますか?

4

3 に答える 3

0

次のように 2D 配列を動的に割り当てることができることに注意してください。

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

生活を少しシンプルにします。iこのようにしjて、単一の次元 にマップする代わりに、通常の 2D 配列インデックスを使用できます。

ニット:

コンパイラのドキュメントにの有効なシグネチャとして明示的に記載されていない限り、代わりに を使用してください。本やオンラインで何千もの例を見てきたことは知っていますが、コンパイラがそれについて文句を言わないからといって、それが間違っていないというわけではありません。 void main()mainint main( void )void main()

rand()intに収まらない を返しますunsigned charrand符号なし型のオーバーフローは明確に定義されていますが、それでも結果を [0..255] の範囲に明示的にマップしたい場合があります。

于 2013-09-12T19:33:31.867 に答える