C++ 的随机函数rand 和srand

本文献给亲爱的猪小哼同学。

在C++ 中,rand() 会产生一个随机值,而srand() 是为rand() 函数设置随机数种子。

什么是随机数种子?我们可以把随机数种子是个随机数盒子的标签, 如果这个种子(标签)相同,随机数盒子里的数都是相同的。

如果我们不设置这个种子,系统缺省会认为这个种子是 1 。如果种子相同,取出的随机数相同,例如:

#include<iostream>
#include <stdlib.h> 
 
using namespace std;
 
int main()
{ 
    srand(10);   
       for(int i = 0; i < 10; i++)
   {
      cout << rand() << endl; 
   
   }   
   return 0;
}

我们运行两遍:

可以发现,虽然每次RAND  返回的值可能不同, 只要相同的种子,每次程序运行返回的数据集合是相同的。

所以,为了程序每次运行返回不同的随机数,种子最好每次不一样。

如何使每次的种子都不一样,而且这值是整数? 时间,从1970年1月1日到当前的时间的秒数,每次都是变化的,拿这个做种子,最合适了,这个时间就是time(0)。


#include<iostream>
#include <stdlib.h> 
 
using namespace std;
 
int main()
{ 
    srand((unsigned)time( 0 ));   
    for(int i = 0; i < 10; i++)
   {
      cout << rand() << endl; 
   
   }   
   return 0;
}

运行两遍:


如果我们把srand((unsigned)time( 0 )); 放在循环里:

#include<iostream>
#include <stdlib.h> 
 
using namespace std;
 
int main()
{ 
       
    for(int i = 0; i < 10; i++)
   {
	  srand((unsigned)time( 0 ));
      cout << rand() << endl; 
   
   }   
   return 0;
}

你发现,还不是两次运行结果一样,即使同一次每次RAND 取值也一样

这是因为time(0) 返回的是秒数,如果CPU运行太快,每次取得的time(0) 值是相同的。 而且每次都是先置种子,就取值,相当于每次都从相同标签的随机盒子里取第一个。

 我们可以模拟一下延迟1秒,使得每次time(0) 返回值不一样

#include<iostream>
#include <stdlib.h> 
#include <unistd.h>
//#include <windows.h>
using namespace std;
 
int main()
{ 
       
    for(int i = 0; i < 10; i++)
   {
	  srand((unsigned)time( 0 ));
      cout << rand() << endl; 
      sleep(1.0);
   }   
   return 0;
}

sleep 函数,在linux  下使用#include <unistd.h> ,windows 下使用#include <windows.h>

运行:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值