1

OpenVMS を使用して C で開発しています。1001 (0 ~ 1000) 要素の配列、1000 (0 ~ 999) の 0 ~ 50 の乱数を入れるコードを作成しました。コードは次のとおりです。

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

main(){
    int vet[1000], fre[50];
    int i;

    srand(time(NULL));

    for(i=0;i<1000;i++){
        vet[i]=(rand()%51);
    }

    for(i=0;i<1000;i++){
        printf("%d\n", vet[i]);
    }

    for(i=0;i<1000;i++){
        fre[vet[i]]=fre[vet[i]]+1;
    }

    for(i=0;i<51;i++){
        printf("The number %d  was generated %d times\n", i, fre[i]);
    }
}

各数値が生成された回数を表示すると、50 という数値が大きく、時には他の数値の 2 倍以上になることがわかりました。誰か助けてください。

解決済み 機能するコード今のところ srand() を使用する必要があります

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

main(){
        int vet[1000], fre[51] = {0};
        int i;

        srand(time(NULL));

        for(i=0;i<1000;i++){
                vet[i]=(rand()%51);
        }

for(i=0;i<1000;i++){
printf("%d\n", vet[i]);
}

        for(i=0;i<1000;i++){
                        fre[vet[i]]=fre[vet[i]]+1;
        }

        for(i=0;i<51;i++){
                printf("The number %d  was generated %d times\n", i, fre[i]);
        }
}
[EOB]

皆さん、ありがとうございました

4

3 に答える 3

5
    int vet[1000], fre[50];


    for(i=0;i<51;i++){
            printf("The number %d  was generated %d times\n", i, fre[i]);
    }

問題 1: 50 個の要素を持つと宣言freしていますが、51 個を使用しています。

問題 2:fre初期化されていません。

int vet[1000], fre[51] = {0};

合理的な出力が得られるはずです。

于 2012-12-10T14:02:40.877 に答える
3
int vet[1000], fre[50];

vet[] 配列には 1001 ではなく 1000 エントリがあります。fre[] には 51 ではなく 50 があります。0 から 50 までの数値を生成する場合は、fre[] を fre[51] として宣言する必要があります。

また、結果を蓄積する前に fre[] 配列をクリアすることもありません。

于 2012-12-10T14:02:18.887 に答える
1

1)変数を使用する前に、変数を初期化します。

int vet[1000] = {0};
int fre[50] = {0};

2)配列サイズ外の値をチェックしています:

for(i=0;i<51;i++){  

する必要があります:

for(i=0;i<50;i++){

配列fre[50]にはからまでの要素がありfre[0]ますfre[49]。したがって、カウントを0から開始して<50、つまり49に移動する必要があります。

3)配列サイズ外の数値を生成しています:

vet[i]=(rand()%51);

する必要があります:

vet[i]=(rand()%50); 

rand() % xは、の間の数値を生成し0-(x-1)ます。配列がサイズの50場合、その要素は0-49です。これは、選択する必要があることを意味します%50。そうでない場合は、次のように割り当てるときに配列サイズを超えます。fre[vet[i]]=fre[vet[i]]+1;

4)rand()関数は疑似ランダム出力を生成するため、希望するほど「ランダム」にならない可能性が常にあることに注意してください。


編集
わかりました 、あなたのコメント:2) No because I'm checking also 0配列がどのように機能するか理解していないと私に思わせます:

int fre[50] = {0};

50個の要素の配列を提供します。配列のインデックスは0から始まり、[要素数-1]になり、次のようになります。

first element -->fre[0], fre[1], fre[2], ..., fre[48], fre[49] <-- last element

0から50までの値を記録する場合、配列に51個の要素が必要です。

int fre[51] = {0};

したがって、これらの両方:

for(int i=0; i<50; i++)    and    for(int i=0; i<51; i++)

0から開始し、各要素を実行しますが、前者はfre[50](0から49までの50fre[51]個の要素)で機能し、後者は(0から50までの51個の要素)で機能します。

于 2012-12-10T14:09:59.360 に答える