C++中随机数生成问题总结:rand()与random库

 1、 C 库函数 rand()

在 C++ 程序中,在新标准出现之前,C 和 C++ 都依赖一个简单的 库函数 rand 来生成随机数

这个函数生成的是均匀分布的伪随机数,每个随机数的范围在 0 和一个系统相关的最大值(至少为 32767)之间。

rand()函数

int rand(void);

 返回一个 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 随机数

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值