rand的使用方法--C99版

How to use rand -- C99 version

我正在编写一个 C 程序,我想像这样使用 for

for(int i=0 ; i < something ; i++ )

所以我需要使用C99版本才能初始化 for里面的counter C99 版本不适用于 rand() 功能。

事实上,rand() 的手册页中提到:“该函数不是 C99 的一部分,而是 POSIX 的一部分”

为了避免在 for 之前初始化计数器的任何想法..

//更新

编译的输出是:

warning: implicit declaration of function ‘rand_r’ [-Wimplicit-function-declaration]

代码:

array[i] = rand_r(&seed) % MAX + MIN;

谢谢

rand() 是 C99 标准的 大部分 部分,您只需确保包含正确的头文件即可。

#include <stdlib.h>
int main(void) {
    return rand() % 10;
}

stdlib.h头文件包含在C99标准的7.20中,rand()包含在7.20.2.


如果您的手册页声明它不是 C99 的一部分,那么它是不正确的。我的(在 Debian Jessie 下)明确指出:

The functions rand() and srand() conform to SVr4, 4.3BSD, C89, C99, POSIX.1-2001.

但是,当然,控制文件是标准本身。


可能误读了手册页,或者编写手册页的人可能会感到困惑。 random()srandom() 函数不是 C99 的一部分(它们是 POSIX),但是 rand()srand() 肯定是 是。

或者您可能正在使用 rand_r,可重入版本。那也是 POSIX 但不是 C99。

如果你想在C99模式下使用gcc来获得for (int i = 0...的功能,但是仍然希望能够调用非C99的函数, 用 -std=gnu99 而不是 -std=c99.

编译

使用 stdlib 库并添加以下代码。

#include <stdlib.h>
var_name =( rand() % 50);

恐怕你误会了几件事。

rand()rand_r()random() 是三个不同的函数。

rand() 由 ISO C 标准指定,并在 <stdlib.h> 中声明。它包含在 C 标准的所有版本中(1990、1999 和 2011)。这意味着您可以依赖 任何 符合托管 C 实现来提供它(根据定义;任何不实现 rand() 的托管实现都是 non-conforming)。 (符合要求的独立实现不需要提供 rand(),或者根本不需要任何库函数;此类实现通常用于嵌入式系统。)

rand_r()不是ISO C标准规定的;相反,它由 POSIX 标准指定。 POSIX 在 ISO C 定义的基础上定义了许多库函数。事实上,C99 没有指定 rand_r() 而不是 意味着你不能在 C99 程序中使用 rand_r();它仅仅意味着你不能在 portable C99 程序中使用它。 (一个 100% 可移植的 C 程序不能依赖于 POSIX,因为不是所有的实现都支持 POSIX。)rand_r(),像 rand(),被声明(如果它被声明的话)在 <stdlib.h>。您可能需要做一些额外的事情来启用 rand_r() 和其他 POSIX-specific 功能。对于 gcc,您可以通过 而不是 指定 -pedantic,或者通过指定 -std=gnu99(具有 GNU 扩展的 C99),或者通过添加

#define _POSIX_C_SOURCE 1

到源文件的顶部, #include <stdlib.h>.

之前

rand_r() 类似于 rand(),但它被设计为 thread-safe,因为它使用由调用者控制的种子而不是隐式静态分配的种子。

请注意,POSIX 标准表示 rand_r() 可能会从未来的 POSIX 标准中删除,可能是因为有更好的 pseudo-random 数字生成器。

random() 是另一个不同的函数。它类似于 rand(),但更复杂一些。与 rand_r() 一样,random() 由 POSIX 定义,但不是由 ISO C 定义。如果您想使用 random(),则需要考虑类似的注意事项。由于我不完全清楚的原因,您需要使用不同的符号(_SVID_SOURCE 而不是 _POSIX_C_SOURCE)。至于任何功能,您应该阅读文档以了解确切的使用方法。

None 这与 C99 风格的 for 循环有关。 C90 不允许以下形式的循环:

for (int i = 0; i < N; i ++) { /* ... */ }

1999 年的标准(当然在 2011 年的标准中保留了该特性)已将此功能添加到该语言中。这是该语言的核心特性,与标准库无关。

要使用 C99 风格的 for 循环,您需要使用接受它们的编译器,可能带有 command-line 选项来告诉它使用 1999 标准或更高版本。

要使用 POSIX-specific 函数(或 any 库函数),您需要阅读特定函数的文档并按其说明操作,其中包括 #includeing 定义它的 header,可能定义一些符号来启用它,并可能在调用编译器或链接器时添加额外的 command-line 选项。