【问题标题】:The rand() function generate ridiculous numbers [closed]rand() 函数生成荒谬的数字[关闭]
【发布时间】:2022-11-17 00:43:20
【问题描述】:

我不明白为什么 rand() 函数返回如此荒谬的整数。前 4 个生成的数字似乎没问题,但它们之后发生了什么?

有代码片段:

int i=0, j=0;
int tab[4][3];
srand(time(0));

    for(i;i<=3;i++) {
        for(j;j<=2;j++) {
            tab[i][j] = rand() % 50;
        }
    }


    for(i=0;i<=3;i++) {
        for(j=0;j<=2;j++) {
            printf("%d\t", tab[i][j]);
        }
        printf("\n");
    }

输出是:

16      31      24
24      65535   -1068880744
-1068880744     65535   1358574848
1358574848      1323076347      -1068880848

【问题讨论】:

  • 发布一个正确的minimal reproducible example。据我们所知,您正在破坏阵列。 (并且根据那些循环无意义的初始值设定项和上限来判断,这可能是一个很好的猜测。
  • 第一个循环不会每次通过 i 循环都将 j 重置为 0。所以它只填充表的第 0 行(假设你在循环之前有 i = 0
  • 使用 &lt;= 作为数组的循环条件通常是不正确的。此外,您永远不会初始化 ij 成员(在您显示的代码中),因此它们可能具有不确定(“垃圾”)值。
  • 正如其他 cmet 所说,像 for(i;i&lt;=3;i++) 这样的循环是双重错误的。你几乎肯定想要for(i = 0; i &lt; 3; i++)。 C 中的数组是从 0 开始的,所以如果某处有 int tab[3][2],您希望 i 取值 012j 取值 @987654339 @,1
  • 全部输出看起来是假的。 rand() % 2 的计算结果为 01,但打印的结果都不是这些值中的任何一个。

标签: c random srand


【解决方案1】:

好的,问题出在我的第一个 for 循环条件中, 它需要看起来像这样:

    for(i=0;i<=3;i++) {
        for(j=0;j<=2;j++) {
            tab[i][j] = rand() % 50;
        }
    }

【讨论】: