5

我对 C++ 中的 rand() 函数用法有 2 个查询:

  1. rand() 函数在哪里定义?cout<<rand()<<endl;我在一个循环中编写了一个简单的程序, 除了<iostream>..之外我没有包含任何头文件。这是如何工作的?在我在几个站点中遇到的参考示例中,有些人说,你需要包含 <stdlib.h>,其他人说,<time.h>..所以想知道我的程序是如何工作的..有什么想法吗?
  2. 我在使用“rand()”之前听说过,需要通过给 srand 一个种子来进行初始化,通常种子是当前的 unix 时间 -> srand(time(NULL)).. 但是,我没有在我的简单程序中这样cout<<rand()<<endl;做while 循环,它正在显示随机数。所以问题:srand(time(NULL))用于提高随机性,因为它不是强制性的?如果不是,那么使用它的意义何在。

感谢你的帮助!

谢谢!

4

7 回答 7

3

它在<cstdlib>标题中声明。标准库头文件(<iostream>在你的例子中)可能包括其他标准头文件,但你不应该依赖它,因为它是特定于实现的。包括您明确需要的标题。

播种随机数生成器是强制性的,除非您对您的程序每次运行时都会生成相同的“随机”序列这一事实感到满意 :)

于 2013-08-25T11:51:08.807 回答
1

rand()函数在 stdlib.h 中声明,因此您需要#include <stdlib.h>在程序中。您也可能想要,#include time.h因为time()在那里声明了用于初始化随机种子的函数

srand (time(NULL));

rand()如果您想在每次运行程序时产生(不同的)伪随机序列,则必须初始化种子

http://en.cppreference.com/w/cpp/numeric/random/rand

于 2013-08-25T11:53:42.343 回答
1

rand()在标准库中定义。它在标题中声明,<stdlib.h>并且<cstdlib>; 首先,它在全局命名空间中;第二,在命名空间中std。您应该#include为程序使用的所有标准库元素提供适当的标题;有时名称也会在其他标头中声明,但这纯粹是您的实现内部。

至于播种,如果你自己不给生成器播种,你会得到一个默认的种子,每次运行程序时都是一样的,就好像你调用了srand(1). rand()每次运行程序时,您都会得到相同的数字序列。这对于调试很有用,但当然,当应用程序存在于现实世界中时,它就没有用了。要产生不同的随机数序列,请srand在程序启动时调用,并在每次调用时赋予它不同的值。就是stand(time(NULL))这样。

于 2013-08-25T11:58:08.990 回答
0

我将解决以下问题:

1)rand()函数定义在stdlib你可以在这里阅读。为函数time引用time(NULL)_srand

2) srand()- 使用作为种子传递的参数初始化伪随机数生成器。

对于调用中使用的每个不同的种子值srand,可以预期伪随机数生成器在随后调用 rand 时生成不同的连续结果。

具有相同种子的两个不同初始化将在后续调用 rand 时生成相同的连续结果。

rand如果种子设置为 1,则生成器将重新初始化为其初始值,并生成与调用or之前相同的值srand

为了生成类随机数,srand通常初始化为一些独特的运行时值,如函数 time 返回的值(在 header 中声明<ctime>)。这对于大多数琐碎的随机化需求来说已经足够独特了。

于 2013-08-25T11:52:28.747 回答
0
  1. 它包含在cstdlib

    您可能已包含此标准标题iostream

  2. 您是否重新运行您的程序并注意到之前运行生成的数字之间的任何共同点。

    是的!所以,srand这就是您所需要的,它使用当前时间为随机数生成器播种。

于 2013-08-25T11:54:08.823 回答
0

如果您阅读手册页 - http://linux.die.net/man/3/rand - 它会告诉您它是自动播种的值为 1。至于为什么不需要包含stdlib,那一定是包含在里面了。iostream

于 2013-08-25T11:54:22.723 回答
0

rand() 函数在哪里定义?

它包含在 c 标准库<stdlib.h>中,而<cstdlib>只是 c++ 的<stdlib.h>. 如果您需要time()功能,请记住也包含<time.h>

srand(time(NULL)) 是否用于提高随机性,因为它不是强制性的?

在大多数情况下,这不是强制性的。由于rand()生成的不是真正的随机数,而是伪随机数,其中的生成过程依赖于一个种子,或者一个初始值。

因此,如果您需要生成的序列号与上一个序列号不同,则需要设置不同的种子,否则您的程序的每次执行都会生成相同的序列号。

于 2013-08-25T12:02:41.717 回答