C++中的rand()和srand()

Man*_*dey 8 c++ random

在C++中生成随机数的基础是什么?

那背后有一些逻辑或原理吗?

数字是否完全随机生成?

假设我正在运行此程序:

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

int main()
{
    /*
    Declare variable to hold seconds on clock.
    */
    time_t seconds;
    /*
    Get value from system clock and
    place in seconds variable.
    */
    time(&seconds);
    /*
    Convert seconds to a unsigned
    integer.
    */
    srand((unsigned int) seconds);
    /*
    Output random values.
    */
    cout<< rand() << endl;
    cout<< rand() << endl;
    cout<< rand() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它显示的内容:http: //img14.imageshack.us/img14/1538/98271820.png

它显示205两次.

Dar*_*rer 6

问题基本上在评论和另一个答案中回答,但我会在一个地方收集它.

C++ rand()函数不是一个真正随机的数字序列,而是一个伪随机序列.这意味着它基本上是一个预先定义的数字序列,它们是" 随机的 ",但在某处固定(实际上,它比这更复杂,但这是为了更好地理解的简化).可以把它想象成一个很长的整数列表.

每次调用rand()函数都会拉出当前数字并将指针移动到"当前"随机"数字"到下一个.

什么srand()函数基本上将指针设置为列表中的某个位置.如果您不在srand()每次启动时调用该函数,或使用固定参数(种子)调用它,则每次启动程序时都会有相同的数字序列.

当您从秒开始设置种子时,如果您在该秒内启动程序两次,则种子将是相同的 - 因此产生相同的结果.

请尝试以下代码:

#include <windows.h>
// << other code >>
for (int i=0; i<50; i++) {
    time(&seconds);
    srand(seconds);
    cout<< seconds<<" "<<rand()<<endl;
    Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)

您会注意到,每个"秒"值对应于rand()函数的某个固定"第一"值.


Mat*_*son 2

从第二个问题开始:

生成的数字是完全随机的吗?

不,这在计算机中不太可能发生。它们是“伪随机”数字,是一些数字序列,其范围随时间以类似随机的方式变化。但如果你从相同的“种子”开始,你每次都会得到相同的序列。这种可预测性有时非常有用,因为它允许多次重复相同的实验并获得相同的结果 - 改变种子,将允许类似的运行产生不同的结果。

该函数srand设置种子。有些系统确实有一个名为 的函数randomize,但它本身并不是标准的一部分。如果它确实存在,它将种子设置为代码未知的内容 - 例如当前时间(以毫秒为单位)。

这背后有什么逻辑或者原理吗?

是的。有多种生成伪随机数的方法。int简单的可以使用正则或类型用一两行 C 代码编写long,并且只包含取“当前值”+一些常量,乘以一些大数并对其他大数取模。

更复杂的涉及数十行相当复杂的数学和大量数字 - 例如 Mersenne Twister 是最近的作品,如果您稍微搜索一下,就可以作为源代码获得。