为数组写入值时,为什么会出错?

时间:2011-11-27 16:18:58

标签: c random vector srand

我试图确定为什么将随机值写入数组导致问题。

我实际上要求r and()生成1到10之间的数字(rand() %10 +1,前面有srand(time(NULL))),第一个值总是高于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;
}`

2 个答案:

答案 0 :(得分:1)

原因很简单。

a[i]在1到10之间,因此当你写:

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

您正在填写frequency的索引2到11。但是,frequency只有索引0到10.因此,您将遍历数组frequency并进入数组a并写入a[0]。当a[i]为10时会发生这种情况。由于有100个数字,有10%的可能性得到10,您将a[0](通过递增frequency[11])增加约10倍。由于第一个值也介于1和10之间,因此最终值介于10和20之间。

修改:出于同样的原因,您将a从0索引到SIZE-1,您还应该将frequency从0到10编入索引。您正在做什么是创建从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]);

请注意,从0开始,不到10,并按frequency而不是i索引i+1

或者,您可以

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

通过frequency索引i-1以使索引正确。

答案 1 :(得分:0)

我编译了你的代码并且它生成了1到10之间。没有办法在使用%的情况下超越范围0-9(或1到10与+1),因为它一旦达到10,这意味着/将高1并且模数必须再次从0开始。编辑:你不能将30除以10并且说它是2而余数为10,因为这个余数将翻译至10的+1,即30除以10 = 3,余数为0。