随机数指的是从一个可能的范围中挑选出一个值返回,每一个范围内的数字被选中的概率是一样的。C++中提供了一系列函数来实现随机数生成。
1. rand
rand函数每次都返回一个0~65536范围内的随机整数。这些随机数通过算法生成,并不是真正的随机数。
1 #include <iostream> 2 #include<cstdlib> 3 using namespace std; 4 5 int main() 6 { 7 for(int i=0;i<10;i++){ 8 int c = rand(); 9 cout<<c<<endl; 10 } 11 return 0; 12 }
2.srand
rand()算法需要一个起始值,称为种子,根据随机种子,rand算法会产生数据流。如果没有给定的话默认是1,所以如果每次都不指定随机种子,最终得到的数据流会完全相同,rand函数的返回结果也就一模一样。为了避免这种情况发生,需要在rand()调用之前指定种子,C++中是通过srand()函数实现的。
1 #include <iostream> 2 #include<cstdlib> 3 using namespace std; 4 5 int main() 6 { 7 unsigned seed; 8 cin>>seed; 9 srand(seed); 10 for(int i=0;i<10;i++){ 11 int c = rand(); 12 cout<<c<<endl; 13 } 14 return 0; 15 }
这样获取随机数都需要手动输入,比较麻烦。另外一种方式是通过当前时间进行初始化。
1 #include <iostream> 2 #include<cstdlib> 3 #include<ctime> 4 using namespace std; 5 6 int main() 7 { 8 srand((unsigned)time(0)); 9 for(int i=0;i<10;i++){ 10 int c = rand(); 11 cout<<c<<endl; 12 } 13 return 0; 14 }
3. uniform_int_distribution和uniform_real_distribution
上面的两个函数能解决很多问题,但是还是不够全面,如果我们希望生成一个范围内的随机数呢,如果我们希望生成一个double类型的随机数呢?C++为我们提供了uniform_int_distribution和uniform_real_distribution两个模板类。调用这连个模型需要调用random库。
1 #include <iostream> 2 #include<cstdlib> 3 #include<ctime> 4 #include<random> 5 using namespace std; 6 7 int main() 8 { 9 default_random_engine random(time(0)); //生成随机种子的引擎 10 uniform_int_distribution<>dis1(0,100); 11 uniform_real_distribution<>dis2(0.0,1.0); 12 13 for(int i=0;i<10;i++) 14 cout<<dis1(random)<<endl; 15 cout<<endl; 16 17 for(int i=0;i<10;i++) 18 cout<<dis2(random)<<endl; 19 cout<<endl; 20 return 0; 21 }