0

ランダムな値を配列に書き込むと問題が発生する理由を特定しようとしています。

私は実際に rand()に 1 から 10 の間の数値を生成するように依頼します( rand() %10 +1, with srand(time(NULL))before) と、最初の値は常に 10 より大きくなります: これも 10 から 20 の間のランダムな数値です。randsrand関数の問題のように。それにもかかわらず、これは私のコードです:

編集:正しいコード、今

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZEA 100
#define SIZEFREQ 10

int main()
{
    int a[SIZEA]={0},frequency[SIZEFREQ]={0};
    int i,temp,gothrough;

    srand(time(NULL));

    for(i=0;i<=SIZEA-1;i++)
    {
        a[i]=rand() %10 +1;
        ++frequency[a[i]-1];
    }

    printf("These are the elements in the vector:\n");
    for(i=0;i<=SIZEA-1;i++)
    {
        printf("%3d,",a[i]);
    }

    printf("\nLet's try to put them in order\n");
    for(gothrough=0;gothrough<=SIZEA-1;gothrough++)
    {
        for(i=0;i<=SIZEA-2;i++)
    {
        if (a[i]>a[i+1])
        {
            temp=a[i];
            a[i]=a[i+1];
            a[i+1]=temp;
        }
    }
}

for(i=0;i<=SIZEA-1;i++)
{
    printf("%3d,",a[i]);
}

printf("\n\nValue Frequency\n");
for(i=0;i<=SIZEFREQ-1;i++)
{
    printf("%5d%10d\n",i+1,frequency[i]);
}

return 0;
}`
4

2 に答える 2

1

理由は簡単です。

a[i]は1から10の間であるため、次のように記述します。

++frequency[a[i]+1];

のインデックス2から11を埋めていますfrequency。ただし、frequencyインデックスは0から10のみです。したがって、配列frequencyを調べて配列aに書き込み、を上書きしa[0]ます。これは、a[i]が10の場合に発生します。100個の数値では10%の確率で、10を取得しますa[0](インクリメントすることによりfrequency[11])約10倍になります。最初の値も1から10の間だったので、最終的な値は10から20の間になります。

編集: 0から10までのインデックスを作成するのと同じ理由で、0aから10までSIZE-1のインデックスも作成する必要がありますfrequency。1から10までのインデックスを作成し、それら+1することです。たとえば、これは次のとおりです。

for(i=1;i<=10;i++)
    printf("%5d%10d\n",i,frequency[i+1]);

する必要があります

for(i=0;i<10;i++)
    printf("%5d%10d\n",i,frequency[i]);

10からではなく、0から開始することと、ではなくfrequencyによってインデックスを作成することの両方に注意してください。ii+1

または、

for(i=1;i<=10;i++)
    printf("%5d%10d\n",i,frequency[i-1]);

インデックスfrequencyi-1正しくするためにインデックスを付けます。

于 2011-11-27T16:34:17.683 に答える
0

あなたのコードをコンパイルしたところ、1 から 10 の間で生成されまし%/。 1 高くなる AND モジュロは 0 からやり直す必要があります。 = 3 で余りは 0 です。

于 2011-11-27T16:25:27.987 に答える