在C++中iostream里面封装的就有随机数函数rand()和srand(),它们的作用分别是产生随机数和产生随机数的种子。

函数原型分别如下:

void	 srand(unsigned);
int	 rand(void);

下面就直接根据代码分析:

#include <iostream>
using namespace std;


int main(int argc, const char * argv[])
{

    // insert code here...
    srand(time(NULL));
    for (int i=0; i<100; i++) {
        
        cout<<rand()<<endl;
    }
   

    return 0;
}

这个是伪随机产生的例子,给产生随机数的函数一个种子,当然种子为系统当前的时间戳,产生如下结果:

1660164204
124751157
748656227
558519416
384803675
1322104608
598851147
1782857787
651499518
1880766620
..........

再运行一次

1707324646

328834108

1239429425

498970075

266408990

32490935

614298207

1556073920

878520274

1340171993

1462196615

1483135684

1218750259

836577927

......................


不用种子的话,会产生如下结果:

#include <iostream>
using namespace std;


int main(int argc, const char * argv[])
{

    // insert code here...
    // srand(time(NULL));
    for (int i=0; i<100; i++) {
        
        cout<<rand()<<endl;
    }
   

    return 0;
}

第一次结果:

16807

282475249

1622650073

984943658

1144108930

470211272

101027544

1457850878

1458777923

2007237709

823564440

......................

第二次结果:

16807

282475249

1622650073

984943658

1144108930

470211272

101027544

1457850878

1458777923

2007237709

823564440

1115438165

1784484492

74243042

......................

竟然是一样的,显然是错误的。


再试一种方式,将srand放在循环里 面

#include <iostream>
using namespace std;


int main(int argc, const char * argv[])
{

    // insert code here...
    
    for (int i=0; i<100; i++) {
        srand(time(NULL));
        cout<<rand()<<endl;
    }
   

    return 0;
}

第一次结果:

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

1713459201

......................

这真不是随机,猜测应该是循环执行的时间太快,每一次rand()函数都要接受一个种子来初始化本身,种子基本上是一样的,随机数的值是一样的。