srand(time(0))和随机数生成

时间:2011-01-19 14:39:31

标签: c++ random

srand(time(0)) 

在C ++中用于通过为rand设置起始值来帮助生成随机数。

但是,你能解释它究竟是做什么的吗?

感谢。

6 个答案:

答案 0 :(得分:19)

srand()为随机函数提供一个新种子,一个起点(通常通过取前一个数字(或种子)来计算随机数,然后对该数字进行许多操作以生成下一个)。 / p>

time(0)给出了自Unix时代以来的秒数,这是一个相当不错的“不可预测的”种子(你保证你的种子只有一次相同,除非你在你的种子内多次启动你的程序同样的第二个)。

答案 1 :(得分:4)

根据我的记忆,有一个方程用于生成一系列值。下一个值在某种程度上受前一个值的影响。通过使用时间,您可以设置等式的初始值。请记住,这些值是伪随机的。

例如,如果您执行以下操作:


srand(1);
srand(1);

将生成相同的数字序列。但是,如果你这样做:


srand(time(0));
srand(time(0) + 1);

由于种子值不同,将生成两个不同的数字序列。

答案 2 :(得分:3)

C rand函数使用种子生成随机数(就像大多数 - 任何? - 伪随机生成器一样)。

srand用于设置随机生成器算法使用的种子。 time返回的值(即:当前秒)通常传递给此函数,因为它是最简单的获取值,通常在应用程序的两次执行之间不同

答案 3 :(得分:3)

首先,srand& rand是来自C,而不是C ++,C ++ 0x引入了自己的random number generator classes

除了srand& rand是实现定义的,它们只需要在0和RAND_MAX之间传递一个随机数。在windows上使用TLS存储种子的基本MWC16/32srand设置种子,然后由rand用来滚动伪随机数。

通过随机数生成器,它非常可怕,尤其是Windows版本。

答案 4 :(得分:2)

有一个article at Wikipedia可以提供一些好的历史记录和使用的算法示例。

简短版本是rand()及其类似的伪随机数生成器。事实上,它们实际上是确定性的 - 产生的数字序列总是相同的。然而,序列非常长,并且播种机制提供了在该序列中(或多或少)任意位置开始的方法。

根据随机数的使用方式,评估伪随机数发生器的质量有多种标准。在非常简单的情况下,也许所需要的是连续调用rand()的重复值的概率很低。但是,您可能希望数字也符合特定的统计分布。 (据我所知,大多数PRNG产生均匀分布的数字。但是存在各种函数或者可以很容易地编写这些函数以将其转换为高斯分布或您可能需要的任何其他函数。)

最后,当担心安全问题时,您需要一种算法,出于所有实际目的,该算法是不可预测的。如果攻击者知道先前生成的号码,则她应该无法预测下一个号码。在非常高的安全性应用中,可能会使用真正的随机数生成器;这些将依赖于各种外部随机源,例如无线电静电,图像捕获设备(镜头盖上)或其他此类源中的热噪声。此外,许多现代操作系统(包括Linux)从各种来源收集和存储“熵池”,例如不可预测的用户交互,并允许从中生成随机数。

不习惯使用伪随机生成器的人的常见编程错误是在每次调用rand()之前重新播种。当然,这是不必要的,可能是不可取的。每个发电机只播种一次。

答案 5 :(得分:-2)

#include "stdio.h" //rmv coding for srand is pure
#include "conio.h"
#include "time.h"

void main()
{

    time_t t;

    srand(time(0));

    for (i = 1; i <= 10; i++) 
        cout << (unsigned) rand() % 1000 - 90 << "\t";

    for (i = 1; i <= 10; i++)
        cout << (char) rand() % 100 - 90 << "\t";

    getch();

}