?1、?C?库函数?rand()
在 C++ 程序中,在新标准出现之前,C 和 C++ 都依赖一个简单的 C?库函数?rand ?来生成随机数
这个函数生成的是均匀分布的伪随机数,每个随机数的范围在 0 和一个系统相关的最大值(至少为 32767)之间。
rand()函数
?返回一个 0 ~ RAND_MAX 之间的整数。RAND_MAX 是一个定义在 <cstdlib> 的常数。?
该函数返回的数字实际上是用算法生成的,实际上并不是随机的。它是根据种子生成的,根据不同的种子产生不同的随机序列。系统默认的种子是1,所以说每次使用的随机序列都是固定的。
所以需要配合随机种子生成函数来使用?——
要想使每次运行时变量 x 的值都不同,就必须使它的种子随机,这时就需要用到srand函数。
srand()函数?
void srand(unsigned int seed);
用来设置rand()函数的种子的。根据不同的输入参数可以产生不同的种子。通常使用time函数作为srand函数的输入参数。
time函数会返回1970年1月1日至今所经历的时间(以秒为单位)。
在使用 rand() 函数之前,srand() 函数要先被调用,并且在整个程序中只需被调用一次。
具体使用示例:
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(nullptr)); // 用当前时间作为种子
int min = 5, max = 10;
int randomValue = (rand() % (max - min)) + min;//范围[min,max)
randomValue = (rand() % (max - min + 1)) + min;//范围[min,max]
randomValue = (rand() % (max - min)) + min + 1;//范围(min,max]
}
缺点:
1、不能产生随机浮点数
2、均匀分布:有很多程序需要不通范围的随机数。一些程序需要非均匀分布的随机数。而在编写程序为了解决这些通常会转换?rand ?生成的随机数的范围、类型或者是分布时,常常会引入非随机性。
3、伪随机数:多次循环产生的随机数序列是完全一样的
如:
#include<iostream>
#include<ctime>
using namespace std;
int main() {
for (int j = 0; j < 5; j++) {
srand(time(0)); //产生不同的随机数种子
for (int i = 0; i < 10; i++)
cout << rand() % 10 << " "; //rand函数 ;
cout << endl;
}
}
运行结果:
??
但是,如果将程序修改如下就不会出现这样的重复序列
#include<iostream>
#include<ctime>
using namespace std;
int main() {
srand(time(0)); //产生不同的随机数种子
for (int j = 0; j < 5; j++) {
//srand(time(0)); //产生不同的随机数种子
for (int i = 0; i < 10; i++)
cout << rand() % 10 << " "; //rand函数 ;
cout << endl;
}
}
?运行结果:
??
一种特性应用场景:
结合 rand() 函数的均匀分布以及有限范围的特点,可以在遗传算法的实现中实现“随机性”的要求
double p = (rand()/RAND_MAX)*Len;//将随机数均匀投射到[0,Len]的区间范围内
if(p<X){
//情况1
}
else //……
?详见我之前关于遗传算法实现的文章: GA遗传算法实现记录_努力的耿耿的博客-CSDN博客
2、C++11random库
头文件?random
运用示例代码:
#include<random>//头文件
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
default_random_engine e(time(0));//引擎生成随机序列,设置种子
uniform_real_distribution<double> u(-1.2,3.5);//设置产生的随机数的类型以及范围
for(int i = 0; i < 10; ++i)
cout << u(e) << endl;
return 0;
}
详细原理见这篇博客: ?【C++】c++ 11中的随机数 ——random_S大幕的博客-CSDN博客_c++11 随机数
|