什么是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的两倍。
与第二个问题开始:
生成的数字完全是随机的?
不,那是不太可能不会发生在计算机中。 他们是“伪随机”的数字,这是在范围随着时间的推移在一类随机方式变化的数字的一些序列。 但是,如果你开始用相同的“种子”,你会得到相同的序列中的每个时间。 这种可预测性,有时是非常有用的,因为它允许重复相同的实验几次相同的结果 - 改变的种子,将允许类似的运行有不同的结果。
该功能srand
将种子。 有些系统有一个调用的函数randomize
,但它不是标准本身的一部分。 如果它确实存在,它设置了种子一些不明就里的代码 - 如以毫秒为单位的当前时间。
有一些逻辑或原则的背后是什么?
是。 有用于生成伪randum数的几种方法。 简单的人可以使用常规写在C代码一行或两行int
或long
类型,只是包括采取“当前值” +某个常数,乘以一些大的数量和模其他一些大的数字。
更复杂的涉及几十个相当复杂的数学与大量多行 - 例如梅森倍捻机是最近的工作,如果你搜索一点点可用源代码。
这个问题的评论,另一个答案基本上回答,但我会在一个地方聚集起来。
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()
函数。