首页 > 代码库 > C++ 利用<cstdlib> 头文件 , 产生一个random number generator

C++ 利用<cstdlib> 头文件 , 产生一个random number generator

头文件<cstdlib>中有一个重要的函数 rand() , 可以作为随机数发生器。

现在现在我想产生一个随机数, 我使用如下的程序:

#include <iostream>#include <ctsdlib><span style="font-family: Arial, Helvetica, sans-serif;">using namespace std;</span>int main(){    cout << rand() << endl;    return 0;}

问题来了, 虽然我们产生了一个随机数, 但是无论我运行上述程序多少遍(重新编译, 在运行,也一样是41), 都产生一个确定的数。 即41, 如下:



这是为什么呢。

答案是要想得到一个随机数, 我们需要给这个随机数发生器(random number generator) 输入一个seed(种子)。



现在让我们在函数中调用rand() 函数25次, 用于产生25个随机数:



上述的情况也是一样的, 无论是将该程序运行多少遍, 或者再次编译, 运行, 结果仍然是产生了25个与上述随机数完全一样的随机数。 这仍然是没有seed的原因。


在举一个例子, 模拟骰子。 随机出现的数据是: 1, 2, 3, 4, 5, 6,  现在我们编程产生这个范围的数字, 投25次, 程序如下:

#include <iostream>
#include <random>


using namespace std;

int main()
{
    for (int i = 0; i < 25; i++) {
        cout << 1+ (rand() % 6) << endl; // 必须加1, 否则产生0
    }
    return 0;
}



运行结果如下:



不难推广, 我们可以产生任意范围整数的随机数。

但是问题来了, 由于上述的几个程序的随机数没有seed, 所有无论我们运行多少次程序, 产生的随机数都是相同的。

问什么呢?

 因为没有计算机能够产生完全随机的随机数。  计算机毕竟不是人, 计算机必须按照一定的算法(Algorithm), 一定的指令去执行命令。 也就是说计算机不可能产生完全随机的数据。 但是计算机通过一定的复杂的算法, 我们可以使得其产生的数据看起来是随机的。  

C++产生随机数可以使用的seed random number。 常用的函数是srand()(函数有一个参数, 使我们给进去的任何一个随机数),:

 

#include <iostream>
#include <cstdlib>



using namespace std;

int main()
{
    srand(6);
    for (int i = 0; i < 25; i++) {
        cout << 1+ (rand() % 6) << endl;
    }
    return 0;
}

产生的结果如下:



显然不同了。 但是如果我们不改变srand(6)函数中的参数, 只要我们运行, 或者重新编译运行, 仍然出现同样的结果(同上面的问题一样)。 但是只要我们改变srand() 中的参数, 重新编译, 运行, 出现不同的结果。 例如我们将srand(6)改为srand(10), 就会改变的:




现在我们给出上述所有问题的终极解决办法:

这个解决办法需要包含一个叫做<ctime>的头文件。 这个头文件允许我们去得到计算机的时钟。 如下:

#include <iostream>
#include <cstdlib>
#include <ctime>


using namespace std;

int main()
{
    srand(time(0)); 
    for (int i = 0; i < 25; i++) {
        cout << 1+ (rand() % 6) << endl;
    }
    return 0;
}

编译运行:



再次运行:



也就是说只要重新运行, 就会重新产生和伪随机数。 这正是我们希望得到的结果。 


现在我们解释原因:

我们知道可以通过srand() 去修改我们的算法。 但是如果我们向srand()中传递一个确定的数字, 那么算法产生的结果也是一个确定的数字。 无论我们运行多少次,结果都是一样的。 

但是我们想srand 传递的参数为time(0), time(0) 函数的返回值每一秒都在变化。  随机这样 , 每一次我们运行函数的时候 , 结果都看似随机的了。