[英]rand() and srand() in 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两次。
问题基本上是在评论和另一个答案中回答,但我会在一个地方收集它。
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()
函数的某个固定“first”值。
从第二个问题开始:
数字是否完全随机生成?
不,这在计算机中不太可能发生。 它们是“伪随机”数字,它是一些数字序列,随着时间的推移以随机方式变化。 但是如果你从相同的“种子”开始,每次都会得到相同的序列。 这种可预测性有时非常有用,因为它允许使用相同的结果多次重复相同的实验 - 改变种子,将允许类似的运行具有不同的结果。
函数srand
设置种子。 有些系统确实有一个名为randomize
的函数,但它不是标准的一部分。 如果确实存在,则将种子设置为代码未知的内容 - 例如当前时间(以毫秒为单位)。
那背后有一些逻辑或原理吗?
是。 有几种生成伪冠状数的方法。 简单的可以使用常规的int
或long
类型在一行或两行C代码中编写,并且只包括取“当前值”+一些常量,乘以一些大数并模数一些其他大数。
更复杂的涉及数十个相当复杂的数学行和大数字 - 例如Mersenne Twister是最近的一项工作,如果你搜索一下,它可以作为源代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.