首页 > 代码库 > 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) 函数的返回值每一秒都在变化。 随机这样 , 每一次我们运行函数的时候 , 结果都看似随机的了。