如何使用rand - C99版本

时间:2015-05-14 05:44:22

标签: c for-loop random c99

我正在撰写 C 计划,我希望像这样使用for

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

因此,为了 初始化 的内部&#34; ()&#34;但 C99 版本不适用于rand()功能。

实际上在rand()的手册页中提及:&#34;该功能不是C99的一部分,而是POSIX&#34;

的一部分

任何想法,以避免在for ..

之前初始化计数器

// UPDATE

编译 的输出为:

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

代码:

array[i] = rand_r(&seed) % MAX + MIN;
  • &GT; array [i] type是char *(我已经为它动态分配了空间)

由于

3 个答案:

答案 0 :(得分:4)

rand()非常很多是C99标准的一部分,您只需要确保包含正确的头文件。

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

stdlib.h标题文件包含在C99标准的7.20中,rand()涵盖了7.20.2

如果您的手册页说明它不属于C99,则说明不正确。我的(在Debian Jessie的领导下)明确指出:

  

函数rand()和srand()符合SVr4,4.3BSD,C89, C99 ,POSIX.1-2001。

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

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

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

如果您想在C99模式下使用gcc来获取for (int i = 0...功能,但仍然希望能够调用非C99函数,请使用{{进行编译1}}而不是-std=gnu99

答案 1 :(得分:2)

我害怕你误解了几件事。

rand()rand_r()random()是三个不同的功能。

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

ISO C标准未规定

rand_r();相反,它由POSIX标准指定。 POSIX在ISO C定义的基础上定义了许多库函数。 C99没有指定rand_r()的事实意味着您无法在C99程序中使用rand_r();它只是意味着您无法在便携式 C99程序中使用它。 (100%可移植的C程序不能依赖于POSIX,因为并非所有实现都支持POSIX。)rand_r(),如rand(),在{{1}中声明(如果它已经声明) }}。您可能需要执行额外的操作以启用<stdlib.h>和其他POSIX特定的功能。对于gcc,您可以通过 not 指定rand_r(),或指定-pedantic(带有GNU扩展名的C99)或添加

来执行此操作
-std=gnu99

到源文件的顶部,之前 #define _POSIX_C_SOURCE 1

#include <stdlib.h>rand_r()类似,但它设计为线程安全的,因为它使用由调用者控制的种子而不是隐式静态分配的种子。

请注意,POSIX标准表示可能会从未来的POSIX标准中删除rand(),可能是因为有更好的伪随机数生成器。

rand_r()是另一个不同的功能。它就像random(),但有点复杂。与rand()类似,rand_r()由POSIX定义,但不由ISO C定义。如果您想使用random(),则类似的注意事项适用。由于我不完全清楚的原因,您需要使用不同的符号(random()而不是_SVID_SOURCE)。对于任何功能,您应该阅读文档以确切了解如何使用它。

这些都与C99风格的_POSIX_C_SOURCE循环无关。 C90不允许使用以下形式的循环:

for

1999年标准(以及2011年标准中保留的cource)将该功能添加到该语言中。这是该语言的核心功能,与标准库无关。

要使用C99样式的for (int i = 0; i < N; i ++) { /* ... */ } 循环,您需要使用接受它们的编译器,可能使用命令行选项告诉它使用1999标准或更高版本。

要使用特定于POSIX的函数(或任何库函数),您需要阅读特定函数的文档并执行它所说的内容,其中包括for标题定义它,可能定义一些符号来启用它,并可能在调用编译器或链接器时添加额外的命令行选项。

答案 2 :(得分:0)

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

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