C 随机整数生成器问题(A book on C 4th Edition)

Posted

技术标签:

【中文标题】C 随机整数生成器问题(A book on C 4th Edition)【英文标题】:C random integer generator question (A book on C 4th Edition) 【发布时间】:2020-03-23 00:09:11 【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main(void)

   int i, n;

   printf("\n%s\n%s",
     "Some randomly distributed integers will be printed.",
     "How many do yo want to see? ";
   scanf("%d", &n);
   for (i = 0; i < n; ++i) 
     if (i % 10 == 0)
       putchar('\n');
     printf("%7d", rand());
   
   printf("\n\n");
   return 0;

这是教科书“A book on C”中的代码。

当您在提示时输入 23 时,它应该会生成 3 行 8 列 (3*8-1) 中的 23 个随机数。

我了解到printf("%7d", rand())应该返回一个以十进制整数格式打印的值,并且打印整数的字段的宽度是7。

但是,我得到了宽度超过 7 的随机数,而且它看起来一点也不整洁。 (没有列也没有行,只有一大块连续的数字,比如 1235289043528935294835698246182965982)

我认为这与表达式 printf("%7d", rand()) 函数以及它应该如何返回值的方式有关。

我开始认为教科书是错误的。

【问题讨论】:

n 作为参数会更常见。例如int main(int argc, char *argv) int i, n = argc &gt; 1 ? strtol(argv[1], NULL, 10) : 10;,然后使用参数调用程序。 (例如./a.out 23 【参考方案1】:

您的号码大于 7 位数。你可以试试:

A) 将宽度字段更改为更高:

printf("%14d", rand() );

B) 使生成的数字小于 7 位:

printf("%7d", rand() % 1000 );

有关格式说明符的更多信息可以找到here

希望有帮助!

【讨论】:

【参考方案2】:

您没有打印任何空白。尝试插入一些:

printf("%7d\t", rand());

【讨论】:

是的,添加空格部分有助于通过添加协调到输出,但它并没有解决字段宽度的问题(应该是 7)。我的代码会生成更多的数字,例如 9 或 10 的宽度......【参考方案3】:

除了上面的评论,如果我理解正确你想要所有 8 个数字,那么该行应该更改为:if (i % 8 == 0);

【讨论】:

【参考方案4】:

与其猜测rand()数的最大宽度,不如计算最大随机数的宽度:RAND_MAX

snprintf(NULL, 0, ... 打印在缓冲区足够大的情况下将写入的字符数,不包括终止的空字符。

int width = snprintf(NULL, 0, "%d", RAND_MAX);

稍后打印时,使用宽度。

printf(" %*d", width, rand());

#define COLUMN_N 8
for (i = 0; i < n; ++i) 
  printf(" %*d", width, rand());
  if (i % COLUMN_N == COLUMN_N - 1 || i + 1 == n) 
    putchar('\n');
  

【讨论】:

以上是关于C 随机整数生成器问题(A book on C 4th Edition)的主要内容,如果未能解决你的问题,请参考以下文章

C语言随机整数编程问题?

一道C语言作业题,让你编写随机生成10以内的整数,并且自己输入计算结果的程序,我编写了一些,求教!!

c语言产生4位随机数

数据结构与算法分析(C语言描述)习题2.7

(C语言)一种简易记法:生成[a,b]范围内的随机整数

c语言产生4位随机数