0

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

我实际上要求 rand()生成 1 到 10 之间的数字(rand() %10 +1之前srand(time(NULL))),第一个值总是高于 10:它也是一个随机的,介于 10 到 20 之间。我真的不知道如何解决这个问题,因为它看起来像randandsrand函数的问题。尽管如此,这是我的代码:

编辑:正确的代码,现在

#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 之间。

编辑:出于同样的原因,你索引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,以及索引frequencyi不是i+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。没有办法超过范围 0-9(或 1-10 和 +1)%使用,因为一旦它达到 10,这意味着/将高 1 并且模必须从 0 重新开始。编辑:您不能将 30 除以 10 并说它是 2 余数为 10,因为这个余数将转化为 10 的 +1,即 30 除以 10 = 3,余数为 0。

于 2011-11-27T16:25:27.987 回答