我试图确定为什么将随机值写入数组导致问题。
我实际上要求r and()
生成1到10之间的数字(rand() %10 +1
,前面有srand(time(NULL))
),第一个值总是高于10:它也是随机数,在10到20之间。我真的不知道如何解决这个问题,因为它看起来像是rand
和srand
函数的问题。不过这是我的代码:
编辑:正确的代码,现在
#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;
}`
答案 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。