繁体   English   中英

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

[英]rand() and srand() in C++

在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的函数,但它不是标准的一部分。 如果确实存在,则将种子设置为代码未知的内容 - 例如当前时间(以毫秒为单位)。

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

是。 有几种生成伪冠状数的方法。 简单的可以使用常规的intlong类型在一行或两行C代码中编写,并且只包括取“当前值”+一些常量,乘以一些大数并模数一些其他大数。

更复杂的涉及数十个相当复杂的数学行和大数字 - 例如Mersenne Twister是最近的一项工作,如果你搜索一下,它可以作为源代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM