为什么rand()函数产生的是相同的随机数

问题引入

       今天验收OS课设,模拟程序的不可再现性。通过Sleep(rand())来控制线程的不同执行速度,从而达到在没有进行同步控制的情况下,线程的输出结果具有不可再现性。
所谓不可再现性:就是同一个程序,在不同或相同的运行环境下多次执行,结果是不一样的。)
       但事与愿违,多次执行后,显示结果竟然一样!!!

探究原因

       手动进行Sleep()控制,使之具有不同的执行速度,发现结果确实不一样了,于是查询了一番资料后,发现问题确实出现在rand()函数,随机数产生这块。

问题解决

        rand()函数是计算机C语言中的函数,而srand()会设置供rand()使用的随机数种子。如果在第一次调用rand()之前没有调用srand(),那么系统会自动调用srand()。而使用同种子相同的数调用rand() 会导致相同的随机数序列被生成。我就是在rand()之前没有用srand(),导致线程执行速度是一样的!!

搜狗百科解释

srand((unsigned)time(NULL))则使用系统定时/计数器的值作为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。
库函数中系统提供了两个函数用于产生随机数:srand()和rand()。 原型为:

函数一:int rand(void);

返回一个[0,RAND_MAX]间的随机整数。

函数二:void srand(unsigned seed);

参数seed是rand()的种子,用来初始化rand()的起始值。

但是,要注意的是所谓的“伪随机数”指的并不是假的随机数。其实绝对的随机数只是一种理想状态的随机数,计算机只能生成相对的随机数即伪随机数。计算机生
成的伪随机数既是随机的又是有规律的 ——
一部份遵守一定的规律,一部份则不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这体现到了事物的特性 ——
差异性;但是每种树的叶子都有近似的形状,这正是事物的共性 ——
规律性。从这个角度讲,我们就可以接受这样的事实了:计算机只能产生伪随机数而不是绝对的随机数。

修改前的代码为:

.....
Sleep((rand() % 10)*100);
.....

修改后的代码为:

#include 
.....
srand((int)time(0));
Sleep((rand() % 10)*100);
.....

      再次执行,大功告成

你可能感兴趣的:(多线程)