srand函数如何与时间函数相互作用

How does the srand function interact with time function?

本文关键字:函数 时间 相互作用 srand      更新时间:2023-10-16

我很困惑-我有下面的代码-最小值和最大值是我们的范围值。据我所知,srand函数取一个值——种子值,并返回一个伪随机整数。首先,什么是伪随机整数?

// Constants
const int MIN = 50;
const int MAX = 450;
// Get the system time.
unsigned seed = time(0);
// Seed the random number generator.
srand(seed);
// Generate two random numbers.
int num1 = MIN + rand() % MAX;
int num2 = MIN + rand() % MAX;

我们还需要初始化一个时间值吗?我们可以简单地调用时间函数吗?我相信时间函数会返回一些类似于部分秒的东西——创建我们的随机#?我通常对随机#是如何生成的感到困惑。

感谢

"伪随机整数"意味着它是由函数生成的(因此在理论上是可预测的),但要区分输出和真正的随机值并不容易(例如,如果猴子从袋子里拿走0-9中的一个数字,然后再把它扔回去)。当然,这取决于伪随机函数的好坏。顺便说一句,标准的C/C++rand()对于"严肃"的加密内容来说还不够好。

如果您不使用种子初始化srand,那么您将始终从数字生成器获得相同序列的输出值。之所以使用时间值,是因为假设"部分秒"部分是相对随机的(而且获得时间值相对便宜)。

这是一种确保每次运行都获得不同随机数序列的方法,因为(可能)每次运行的时间()都会有不同的值;您可以(过于简单地)将种子视为该序列的起点。

伪随机数是通过算法产生的一系列确定性(即随机)值。历史上,一种常见的方法是使用一个简单的递归关系:Ui=f(Ui-1),其中Ui是整数值。一瞬间的想法告诉你,一旦你看到U的重复值,所有后续值也将是重复的。这意味着序列循环。一个好的生成器是这样一个生成器,其中U看起来是不相关的,在整数范围内均匀分布,并且具有长周期长度。为生成器设定种子包括在循环中选择一个入口点。如果你总是选择相同的入口点,你将总是得到相同的序列。如果您没有明确地选择初始状态(种子值),那么大多数PRNG都有默认的初始化。

多年来,人们认识到,20世纪50年代至80年代常见的递推函数存在各种问题,这使得人们很容易将其与真正的随机性区分开来。更现代的生成器使用比单个整数更大的状态空间,并在每次调用时将高维空间向下投影为单个整数输出。这意味着您可以获得值的单个重复,但在返回到与开始时相同的状态空间之前,不会获得序列的重复。由于状态空间的位数呈指数级增长,这就产生了更长的可用序列。种子设定仍然包括初始化状态空间。

据我所知,srand函数取一个值——种子值,并返回一个伪随机整数。

差不多,但不完全。它只是设定种子并返回无效。CCD_ 3返回一个伪随机整数。

首先,什么是伪随机整数?

伪随机整数是伪随机数生成器的积分输出。伪随机数生成器是一种生成表面随机数序列的算法。

我们还需要初始化一个时间值吗?我们可以简单地调用时间函数吗?

调用time函数不需要初始化任何内容。

我相信时间函数会返回类似于部分秒的

不偏袒。它返回自epoch以来的秒数。

有关更多信息,请参阅参考文件:

  • http://www.cplusplus.com/reference/cstdlib/srand/
  • http://www.cplusplus.com/reference/cstdlib/rand/
  • http://www.cplusplus.com/reference/ctime/time/

有关伪随机数生成器的基本信息,请参见例如维基百科:http://en.wikipedia.org/wiki/Pseudorandom_number_generator