为什么我的代码没有产生1到N之间的随机数字序列?没有文件产生.我的代码有什么错误?我究竟做错了什么? [英] Why isn't my code producing a random sequence of numbers between 1 and N? No file is produced. What is the error in my code? What am I doing wrong?

查看:86
本文介绍了为什么我的代码没有产生1到N之间的随机数字序列?没有文件产生.我的代码有什么错误?我究竟做错了什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

程序的目标是生成一个介于1到N之间的随机数字序列,其中N作为参数传递给程序,并将结果序列写入文件.

The goal of the program is to generate a random sequence of numbers between 1 and N, where N is passed as an argument to the program, and write the resulting sequence to a file.

我的文件未生成.我究竟做错了什么?我的代码中有任何错误吗?我的代码有问题吗?我可以正确输出文件吗?

My file isn't produced. What am I doing wrong? Are there any errors in my code? Is there something wrong with my code? Am I outputting the file correctly?

/*01*/ //
/*02*/ // random_sequence_v6.c
/*03*/ // Generate a random sequence of all numbers between 1 to N
/*04*/ //
/*05*/ #include "stdio.h"
/*06*/ #include "stdint.h"
/*07*/ #include "stdlib.h"
/*08*/ #include "stdint.h"
/*09*/ #include "sys/types.h"
/*10*/ #include "sys/stat.h"
/*11*/ #include "fcntl.h"
/*12*/ #include "assert.h"
/*13*/ #include "inttypes.h"
/*14*/
/*15*/ typedef uint64_t value_t;
/*16*/
/*17*/ value_t* generate_sequence(int num_values)
/*18*/ {
/*19*/     assert(num_values > 0);
/*20*/     value_t* data = calloc(num_values, sizeof(int));
/*21*/     for (int i = 0; i <= num_values; i++) {
/*22*/        data[i] = i;
/*23*/     }
/*24*/     return data;
/*25*/ }
/*26*/
/*27*/ int random_value(int min, int max)
/*28*/ {
/*29*/     int random_number;
/*30*/     do {
/*31*/         random_number = rand();
/*32*/     } while ((random_number <= min) || (random_number >= max));
           return random_number;
/*33*/ }
/*34*/
/*35*/ void randomize_sequence(value_t* sequence, int num_values)
/*36*/ {
/*37*/     // Fisher-Yates
/*38*/     for(int i = 0; i < num_values-2; i++) {
/*39*/         int random_index = random_value(i, num_values-1);
/*40*/         // Swap them
               int temp = sequence[i];
/*41*/         sequence[i] = sequence[random_index];
/*42*/         sequence[random_index] = temp;
/*43*/     }
/*44*/ }
/*45*/
/*46*/ int main(int argc, char* argv[])
/*47*/ {
/*48*/     int num_values = strtoul(argv[1], NULL, 10);
/*49*/     value_t* pValues = generate_sequence(num_values);
/*50*/
/*51*/     randomize_sequence(pValues, num_values);
/*52*/
/*53*/     // Record results
/*54*/     FILE *fd = fopen("results.txt", "w+");
/*55*/     for (int i = 0; i < num_values; i++) {
/*56*/         fprintf("%i = %"PRIu64"\n", i, pValues[i]);
/*57*/     }
/*58*/     fclose(fd);
/*59*/
/*60*/     return EXIT_SUCCESS;
/*71*/ }

推荐答案

所发布的代码包含很多严重问题.具体来说:

the posted code contains LOTS of serious problems. Specifically:

gcc -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled2.c" -o "untitled2.o" 

untitled2.c: In function ‘generate_sequence’:
untitled2.c:20:35: warning: conversion to ‘size_t {aka long unsigned int}’ from ‘int’ may change the sign of the result [-Wsign-conversion]
 /*20*/     value_t* data = calloc(num_values, sizeof(int));
                                   ^~~~~~~~~~

untitled2.c:22:25: warning: conversion to ‘value_t {aka long unsigned int}’ from ‘int’ may change the sign of the result [-Wsign-conversion]
 /*22*/        data[i] = i;
                         ^

untitled2.c: In function ‘randomize_sequence’:
untitled2.c:42:27: warning: conversion to ‘int’ from ‘value_t {aka long unsigned int}’ may alter its value [-Wconversion]
                int temp = sequence[i];
                           ^~~~~~~~

untitled2.c:44:41: warning: conversion to ‘value_t {aka long unsigned int}’ from ‘int’ may change the sign of the result [-Wsign-conversion]
 /*42*/         sequence[random_index] = temp;
                                         ^~~~

untitled2.c: In function ‘main’:
untitled2.c:50:29: warning: conversion to ‘int’ from ‘long unsigned int’ may alter its value [-Wconversion]
 /*48*/     int num_values = strtoul(argv[1], NULL, 10);
                             ^~~~~~~

untitled2.c:58:24: warning: passing argument 1 of ‘fprintf’ from incompatible pointer type [-Wincompatible-pointer-types]
 /*56*/         fprintf("%i = %"PRIu64"\n", i, pValues[i]);
                        ^~~~~~~~

In file included from untitled2.c:5:0:
/usr/include/stdio.h:312:12: note: expected ‘FILE * restrict {aka struct _IO_FILE * restrict}’ but argument is of type ‘char *’
 extern int fprintf (FILE *__restrict __stream,
            ^~~~~~~

untitled2.c:58:44: warning: passing argument 2 of ‘fprintf’ makes pointer from integer without a cast [-Wint-conversion]
 /*56*/         fprintf("%i = %"PRIu64"\n", i, pValues[i]);
                                            ^

In file included from untitled2.c:5:0:
/usr/include/stdio.h:312:12: note: expected ‘const char * restrict’ but argument is of type ‘int’
 extern int fprintf (FILE *__restrict __stream,
            ^~~~~~~

untitled2.c:48:21: warning: unused parameter ‘argc’ [-Wunused-parameter]
 /*46*/ int main(int argc, char* argv[])
                     ^~~~

Compilation finished successfully.

请注意最后一条消息:Compilation finished successfully.这仅意味着编译器对每个问题都应用了一些解决方法",并不意味着解决方法"是正确的.

Notice that final message: Compilation finished successfully. This only means that the compiler applied some 'workaround' to each of the problems, it does NOT mean that the 'workaround' was correct.

请更正您的代码,以使其干净编译,然后在问题中添加EDIT

Please correct your code so it cleanly compiles, then post a EDIT to your question

一些提示:

  1. 在未首先检查argc以确保用户实际输入了预期的命令行参数之前,切勿访问argv[0].
  2. fprintf()的语法为int fprintf(FILE *stream, const char *format, ...);
  3. strtoul()的语法为unsigned long int strtoul(const char *nptr, char **endptr, int base);
  1. never access beyond argv[0] without first checking argc to assure the user actually entered the expected command line parameter.
  2. the syntax for fprintf() is int fprintf(FILE *stream, const char *format, ...);
  3. the syntax for strtoul() is unsigned long int strtoul(const char *nptr, char **endptr, int base);

另外,关于:

FILE *fd = fopen("results.txt", "w+");

始终检查(!= NULL)返回值.如果失败(即== NULL),请致电

always check (!=NULL) the returned value. If failed (I.E. ==NULL) then call

perror( "fopen failed" );

因此错误消息和文本均会导致系统认为错误发生在stderr上.

so both the error message and the text reason the system thinks the error occurred to stderr.

这篇关于为什么我的代码没有产生1到N之间的随机数字序列?没有文件产生.我的代码有什么错误?我究竟做错了什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆