C 为什么在将值写入数组时出错?

C 为什么在将值写入数组时出错?,c,random,vector,srand,C,Random,Vector,Srand,我试图确定为什么将随机值写入数组会导致问题 实际上,我要求r和()生成介于1和10之间的数字(rand()%10+1,之前带有srand(time(NULL))),第一个值总是大于10:它也是一个随机数,介于10和20之间。我真的不知道如何解决这个问题,因为它看起来像是rand和srand函数的问题。然而,这是我的代码: 编辑:正确的代码,现在 #包括 #包括 #包括 #定义SIZEA 100 #定义SIZEFREQ 10 int main() { inta[SIZEA]={0},频率[SIZE

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

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

编辑:正确的代码,现在

#包括
#包括
#包括
#定义SIZEA 100
#定义SIZEFREQ 10
int main()
{
inta[SIZEA]={0},频率[SIZEFREQ]={0};
int i、temp、gothrough;
srand(时间(空));

对于(i=0;i我编译了您的代码,它生成的值介于1和10之间。无法超过范围0-9(或1-10+1)使用
%
,因为一旦它达到10,就意味着
/
将高出1,模必须从0开始。编辑:你不能用30除以10,然后用余数10表示它是2,因为这个余数将转换为10分之一的+1,也就是说,30除以10=3,余数0。

原因是什么这很简单

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]
(通过增加
频率[11]
)大约10倍。因为第一个值也在1和10之间,所以最终值在10和20之间

编辑:与将
a
从0索引到
SIZE-1
的原因相同,您还应该将
频率从0索引到10。您要做的是创建从1到10的索引,同时+1它们!例如:

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

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

没有办法
rand()%10+1
可以返回
[1;10]
间隔之外的值。我已经运行了您的代码,它似乎工作正常。最后一个循环将输出
frequency[11]
这是未定义的行为。这可能是您困惑的根源吗?当您添加新代码时,为什么留下不正确的版本?如果有人想查看过去的版本,他们可以查看编辑历史记录(单击显示“已编辑时间戳”的时间)。我现在已经更正了我的源代码,正如您在这里看到的:很好。在您的代码中,请记住将
%10
更改为
%SIZEFREQ
;)
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]);
for(i=1;i<=10;i++)
    printf("%5d%10d\n",i,frequency[i-1]);