C/C++查缺补漏:数学处理

前言

  • C和C++中的数学处理不是特别多,数学处理也不是该语言的强项。这里简要介绍遇到的数学处理方法,例如产生服从特定分布的随机数等等。

随机数

  • 这里不讨论c中的随机数产生函数 rand(),直接讨论c++的随机数机制
  • 头文件:random

随机数引擎类

  • unsigned类型随机数序列的发生器
  • 重载函数调用运算符,使得对象变成函数对象

在这里插入图片描述

随机数分布类

  • 使用引擎返回服从特定分布的随机数
  • 同样是函数对象
  • 随机分布类同时还是一个类模板,模板参数有限定。例如,一个均匀分布的分布类:
    在这里插入图片描述
  • 其模板参数有两种,分别被限定为:
    在这里插入图片描述
  • 随机数分布类还有很多种,如 泊松分布、正态分布等,详情请自行查阅《C++ Primer》
随机数引擎类+分布类 = 随机数发生器

案例

  • 用编译器默认指定的随机数引擎类产生10个随机数
int main(int argc, char const *argv[])
{
    default_random_engine e;

    for(int i = 0; i < 10; ++i)
        cout << e() << endl;
        //一次产生一个,必须多次调用
    return 0;
}
  • 使用随机数分布类利用随机数引擎类构造服从均匀分布的10个随机整数
default_random_engine e;//随机数引擎类
uniform_int_distribution<unsigned> u(10, 100);
//随机数分布类,指定生成10~100内的unsigned类型的服从均匀分布随机数
for(int i = 0; i < 10; ++i)
	cout << u(e) << endl;
	//注意:这里u的参数是一个对象,u本身是一个函数对象
	//多次调用产生10个10~100内的unsigned类型的服从均匀分布随机数

如何避免相同随机数序列?

  • 值得注意的是,随机数引擎类产生的随机数同样是伪随机数,故每一次Run同样的随机数引擎对象,产生的随机数序列都是完全相同的。所以这里需要保存状态,使得每一次Run引擎时不会都从第一个产生随机数的状态开始运行,而是接着上一次运行结束后的状态继续运行

注意:这里的Run指的是每一次调用随机数发生器,而不是每一次运行程序。

  • 除此之外,若采用多组相同的随机数发生器同时产生多组随机数序列,会出现多组完全相同的随机数序列,故这里需要用种子对随机数引擎进行初始化。
//解决时间上的随机数序列重复性
//将随机数发生器声明为static
int j = 0;
static default_random_engine e;
static uniform_real_distribution<double> u(1, 10);
    
while(j < 3)
{
	for(int i = 0; i < 10; ++i)
      	cout << u(e) << ' ';
    cout << endl;
    ++j;
}

//Output:
1.76529 9.0245 2.70721 4.58208 7.69161 6.04351 8.2861 5.60541 9.95576 9.6995 
4.83446 6.87699 9.6538 8.72189 3.64624 4.7318 5.63404 8.10806 5.89846 1.84267 
4.89034 8.60435 7.95562 2.72673 8.0233 2.63209 6.21227 3.82718 4.70786 9.93075
//解决空间上的随机数序列重复性
//用不同的种子初始化随机数引擎对象
int main(int argc, char const *argv[])
{
    int j = 0;

    static default_random_engine e1(1);
    static default_random_engine e2(2);
    static default_random_engine e3(3);
    static uniform_real_distribution<double> u(1, 10);

    
    for(int i = 0; i < 10; ++i)
        cout << u(e1) << ' ' << u(e2) << ' ' << u(e3) << endl;
    cout << endl;
    ++j;
    

    return 0;
}

//Output
1.76529 2.53058 3.29588
9.0245 8.049 7.0735
2.70721 4.41442 6.12162
4.58208 8.16415 2.74623
7.69161 5.38322 3.07484
6.04351 2.08702 7.13053
8.2861 6.5722 4.8583
5.60541 1.21083 5.81624
9.95576 9.91152 9.86728
9.6995 9.399 9.09851
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值