6

我目前正在通过“C all-in-one Desk Reference for Dummies”学习 C,并开始教授如何获取随机数。但是,它提供的示例代码不起作用(编译器出现错误“未定义对'random'的引用”)。我的代码在下面,从书中复制。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int hat;

    hat = random();
    printf("%d is a random number.\n",hat);
    return(0);
}
4

4 回答 4

9

由ISO C 标准定义的用于创建伪随机数的函数的名称是rand().

要真正获得看起来随机的伪随机数,您需要使用 为函数播种randsrand()如下所示:

#include <time.h>
#include <stdlib.h>

srand(time(NULL));
int r = rand();

在这里, timetime()函数(在 header 中声明time.h)将当前日历时间作为 type 的值time_t。通过这样做,它rand()每次都会获得不同的值来为函数播种。

编辑:正如 vanza 在下面的评论中指出的那样,有一个random()函数,但它没有在 C 标准中定义。

于 2013-09-13T23:27:52.827 回答
6

random并且srandom是非标准的 C 函数。它们包含在许多平台(linux、BSD 等)上的 glibc 中。但是,由于它们不是 C 标准的一部分,因此它们不需要在所有编译器上都可用。

然而,所有标准 C 编译器都带有randand srand,因此只需将程序更改为 callrand而不是random. 如果您书中的其他示例程序调用了srandom,请srand改用。

将您的程序更改为

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int hat;

    hat = rand();
    printf("%d is a random number.\n",hat);
    return(0);
}

您书中的下一个程序可能会添加一个调用,srandom以使生成的伪随机数真正随机。如果是这样,请srand改用。

如果一本关于 C 的初学者书籍实际上使用randomand srandom,那么它可能应该被扔掉。任何使用 C 语言但没有告诉你它们是非标准的书randomsrandom应该被扔掉。

于 2013-09-13T23:35:09.927 回答
2

random()函数及其播种函数srandom()由 POSIX 指定。它旨在成为比标准 Crand()函数的大多数实现更好的随机数生成器。random()包含在 C 库(通常称为glibc)的 GNU 实现中。如果应用程序期望的随机属性比C 标准实际最低要求提供的rand()随机属性更好,则在对依赖随机性的任何应用程序进行编码时使用可能会很危险。rand()

Windows 系统不提供此特定界面。CrtypGenRandom()可以代替使用。

有关该主题的更多信息random()CryptGenRandom()可以在SEI 的 CERT C 安全编码标准页面上找到。

于 2013-09-14T00:06:23.647 回答
-2

我想你使用了代码块,我使用同一本书,尝试使用 cygwin 而不是默认编译器

于 2019-08-17T20:57:15.963 回答