【c++】随机数的前世今生 C++11标准前后

一直觉得C++随机数对日常的编程来说就像这句话 “食之无味,弃之可惜” ,还是花一点时间仔细了解一下吧。

前世:

C++11标准出现前,无论c和都用下面的方法产生随机数。

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

但是如果你关闭该程序并再次运行的话你会发现输出结果还是这十个同样的数,一般会引入srand()解决。

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

time(0)的返回的是从1970 UTC Jan 1 00:00到当前时刻的秒数,为unsigned int类型。当我们在不同时刻运行程序时,srand(time(0))会设置不同的随机数种子,因此就可以得到不同的结果。注意的是,如果在一秒内执行两次上面的程序输出的结果也是相同的,仔细想想为什么。

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

输出:

可以在两次生成随机数之间插入sleep(1)来手动延时,保证随机数种子不同。

简单介绍rand():

此函数生成均匀分布的伪随机数(线性同余法),每个随机数的范围在0和一个系统相关最大值之间。但是,对于大多数使用随机数的程序来说,它们需要不同范围的随机数,一些应用需要浮点随机数,一些程序需要均匀随机数,为了解决这些问题,我们试图转换rand生成随机数的范围、类型或分布时,常常会引入非随机性。

今生:

C++11引入了随机数引擎随机数分布类的概念,感觉高大上起来了。
头文件:#include<random>

#include <iostream>
#include<random>
#include<time.h>
using namespace std;

随机数引擎:

void test_default_random_engine()
{
 default_random_engine e;
 e.seed(time(0));
 for (int i = 0; i < 10; i++)
  cout << e() << endl;
}

在这里插入图片描述
随机数分布类:

1.生成0~9的无符号整数

void test_uniform_int_distribution()
{
 uniform_int_distribution<unsigned> u(0, 9);
 default_random_engine e;
 e.seed(time(0));
 for (int i = 0; i < 10; i++)
  cout << u(e) << ends;
}

在这里插入图片描述

2.生成0~1随机浮点数

void test_uniform_real_distribution()
{
 uniform_real_distribution<double> u(0, 1);
 
 default_random_engine e;
 e.seed(time(0));
 for (int i = 0; i < 10; i++)
  cout << u(e) << ends;
}

在这里插入图片描述
3.生成正态分布随机数

void test_normal_distribution()
{
 default_random_engine e;
 e.seed(time(0));
 normal_distribution<> n(4, 1.5);//均差4,标准差1.5 默认生成浮点数
 for (int i = 0; i < 10; i++)
  cout << n(e) << ends;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值