兰特()和srand()函数在C ++中(rand() and srand() in C++)

2019-08-17 06:55发布

什么是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;
}

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

这表明205的两倍。

Answer 1:

与第二个问题开始:

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

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

该功能srand将种子。 有些系统有一个调用的函数randomize ,但它不是标准本身的一部分。 如果它确实存在,它设置了种子一些不明就里的代码 - 如以毫秒为单位的当前时间。

有一些逻辑或原则的背后是什么?

是。 有用于生成伪randum数的几种方法。 简单的人可以使用常规写在C代码一行或两行intlong类型,只是包括采取“当前值” +某个常数,乘以一些大的数量和模其他一些大的数字。

更复杂的涉及几十个相当复杂的数学与大量多行 - 例如梅森倍捻机是最近的工作,如果你搜索一点点可用源代码。



Answer 2:

这个问题的评论,另一个答案基本上回答,但我会在一个地方聚集起来。

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);
}

您会注意到,每个“秒”值对应于用于一些固定的“第一”值rand()函数。



文章来源: rand() and srand() in C++
标签: c++ random