在c中生成20个随机数

时间:2013-10-17 21:27:02

标签: c random

#include <stdio.h>
#include <time.h>
int main(int argc,char *argv[])
{

        int i;
        int array[20];
        srand(time(NULL));
        for (i=0; i<20; i++)
            array[i] = rand()%8999 + 1000;

        char *fname = argv[1];
        FILE *fp;
        fp = fopen(fname,"w");
        fwrite(array,sizeof(int),20,fp );

        fclose(fp);
        return 0;
}

我的程序应生成一个包含20个随机数的序列,范围为1000到9999.我需要创建一个包含20个num的数组,对其进行排序并转移到cmd行传递的文件...但是,它表示分段错误

4 个答案:

答案 0 :(得分:2)

获取随机值的公式也是错误的:

使用此代码:

rand()%9999 + 1001;

您将从 [1001,11000] 获取值。如果您声称需要 [1000,9999] 的范围。

尝试解决这个更简单的情况,让我们说 [1,6] 的骰子将是:

rand()%5 + 1

另一个问题是你的for循环:

  • 删除for循环,你应该没问题。你不需要for循环来打印数组。如果您确实需要这样做,请检查rewind功能。

答案 1 :(得分:1)

首先检查fopen的返回值。

然后:

fwrite(array,sizeof(int),20,fp );

您没有移动array指针。使用类似的东西:

fprintf(fp, "%d\n", array[i]);

此外:

array[i] = rand()%9999 + 1001;

rand()%9999产生的价值为9998怎么办?我认为9998 + 1001不再在10009999之间。另外,rand()%9999 + 1001如何产生1000

答案 2 :(得分:1)

  for (i=0; i<20; i++)
       array[i] = rand()%8999 + 1000; // change random Number logic


   for (i=0; i<20; i++)  

      fprintf(fp,"%d\t",array[i]); // change fwrite(array,sizeof(int),20,fp );

请参阅fprintf()

答案 3 :(得分:1)

第一个问题,rand计算是假的,如果你想要一个介于10009999之间的整数,那么它应该是:

array[i] = rand()%9000 + 1000; // 9000%9000 = 0 ...

然后,您对fwrite的调用会写出array缓冲区的全部内容,被视为一组sizeof (int)个长子串。由于赔率非常低,您最终会得到有效的字符编码,当您使用文本编辑器打开文件以查看结果时,您将只有乱码数据...因此,您的整个for循环是无用(您将在文件后面打印array的全部内容的20倍。)

在这里,你可以做的是for循环,调用fprintf以人类可读的格式编写array[i]号码,或者只需坚持一次调用{fwrite 1}}。

然后,我想说你不测试函数调用的返回值。 它可能是错误的来源,所以要非常小心。我想到了整个文件操作函数(fopenfwrite)。

然后,如果argv[1]不存在怎么办?当对fopen的调用运行时,您将遇到分段错误...以下是您可以添加的一点检查:

if (argc > 1) {
    fname = argv[1];
} else {
    fname = NULL;
}