那背后有一些逻辑或原理吗?
数字是否完全随机生成?
假设我正在运行此程序:
#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两次.
问题基本上在评论和另一个答案中回答,但我会在一个地方收集它.
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()函数的某个固定"第一"值.
从第二个问题开始:
生成的数字是完全随机的吗?
不,这在计算机中不太可能发生。它们是“伪随机”数字,是一些数字序列,其范围随时间以类似随机的方式变化。但如果你从相同的“种子”开始,你每次都会得到相同的序列。这种可预测性有时非常有用,因为它允许多次重复相同的实验并获得相同的结果 - 改变种子,将允许类似的运行产生不同的结果。
该函数srand设置种子。有些系统确实有一个名为 的函数randomize,但它本身并不是标准的一部分。如果它确实存在,它将种子设置为代码未知的内容 - 例如当前时间(以毫秒为单位)。
这背后有什么逻辑或者原理吗?
是的。有多种生成伪随机数的方法。int简单的可以使用正则或类型用一两行 C 代码编写long,并且只包含取“当前值”+一些常量,乘以一些大数并对其他大数取模。
更复杂的涉及数十行相当复杂的数学和大量数字 - 例如 Mersenne Twister 是最近的作品,如果您稍微搜索一下,就可以作为源代码获得。
| 归档时间: |
|
| 查看次数: |
29671 次 |
| 最近记录: |