1

我正在使用 OpenVMS 在 C 中进行开发,我已经完成了一个代码,该代码放入了 1001 (0-1000) 个元素数组,1000 (0-999) 个介于 0 和 50 之间的随机数。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main(){
    int vet[1000], fre[50];
    int i;

    srand(time(NULL));

    for(i=0;i<1000;i++){
        vet[i]=(rand()%51);
    }

    for(i=0;i<1000;i++){
        printf("%d\n", vet[i]);
    }

    for(i=0;i<1000;i++){
        fre[vet[i]]=fre[vet[i]]+1;
    }

    for(i=0;i<51;i++){
        printf("The number %d  was generated %d times\n", i, fre[i]);
    }
}

当我显示每个数字产生了多少次时,我看到数字 50 有一个很大的数字,有时比其他数字多一倍,有人可以帮助我吗?

已解决的有效代码我现在必须使用 srand()

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main(){
        int vet[1000], fre[51] = {0};
        int i;

        srand(time(NULL));

        for(i=0;i<1000;i++){
                vet[i]=(rand()%51);
        }

for(i=0;i<1000;i++){
printf("%d\n", vet[i]);
}

        for(i=0;i<1000;i++){
                        fre[vet[i]]=fre[vet[i]]+1;
        }

        for(i=0;i<51;i++){
                printf("The number %d  was generated %d times\n", i, fre[i]);
        }
}
[EOB]

谢谢你们

4

3 回答 3

5
    int vet[1000], fre[50];


    for(i=0;i<51;i++){
            printf("The number %d  was generated %d times\n", i, fre[i]);
    }

问题 1:您声明fre有 50 个元素,但您使用了 51 个。

问题2:fre未初始化。

int vet[1000], fre[51] = {0};

应该给你合理的输出。

于 2012-12-10T14:02:40.877 回答
3
int vet[1000], fre[50];

您的 vet[] 数组有 1000 个条目,而不是 1001。fre[] 有 50,而不是 51。如果要生成从 0 到 50 的数字,则需要将 fre[] 声明为 fre[51];

在累积结果之前,您也永远不会清除 fre[] 数组。

于 2012-12-10T14:02:18.887 回答
1

1)在使用变量之前初始化它们:

int vet[1000] = {0};
int fre[50] = {0};

2)您正在检查数组大小之外的值:

for(i=0;i<51;i++){  

应该:

for(i=0;i<50;i++){

fre[50]您的数组fre[0]通过fre[49]. 因此,您希望您的计数从 0 开始并转到<50,即 49。

3)您正在生成超出数组大小的数字:

vet[i]=(rand()%51);

应该:

vet[i]=(rand()%50); 

rand() % x将生成一个介于 之间的数字0-(x-1),如果您的数组是大小,50那么它的元素是0- 49,这意味着您需要选择%50,否则在分配时您将超过数组大小:fre[vet[i]]=fre[vet[i]]+1;

4) 请记住,rand() 函数会生成伪随机输出,因此它总是有可能不会像您想要的那样“随机”。


编辑
好的,你的评论:2) No because I'm checking also 0让我觉得你不明白数组是如何工作的:

int fre[50] = {0};

给你一个包含 50 个元素的数组。数组的索引从 0 开始并转到 [元素数 - 1],这样:

first element -->fre[0], fre[1], fre[2], ..., fre[48], fre[49] <-- last element

如果要记录从 0 到 50 的值(包括 0 到 50 ,则数组中需要 51 个元素:

int fre[51] = {0};

所以这两个:

for(int i=0; i<50; i++)    and    for(int i=0; i<51; i++)

从 0 开始,遍历每个元素,但前者适用于fre[50](从 0 到 49 的 50 个元素),而后者适用于fre[51](51 个元素,从 0 到 50)

于 2012-12-10T14:09:59.360 回答