c++实训5-6-7-8

因为已经放假,所以很多内容因为学过而省略

实训五 一元多项式的存储与计算

f(x)=anxn+an1xn1+a1x+a0
进行对此方程的计算:
思路,对 an 的这些数进行double存储。然后分解f(x)函数。类似:
f(x)=((((akx+ak1)x+ak2)x+ak3)x++a1+a0
或者直接计算。很简单。

实训六生成正态分布的伪随机数

随机数的生成使用

1.用srand(time(0))初始化随机种子

2.使用rand()函数。生成随机数个数

rand函数的返回值是伪随机数,在范围0~RAND_MAX内均匀分布,RAND_MAX是十进制32767 .为使每次生词的随机数序列不同,所以需要在rand()之前用系统时间指定随机种子。。

生成区间[a,b]的使用办法,rand()%(b-a)+a;

  1. 生成服从正态分布的随机数
    概率密度函数:
    f(x)=1ϕ2πexp((xu)22ϕ2)

    分布函数:
    F(x)=Xf(t)dt

    中心极限定理:
    x~n(0,1)
    X=n1i=0n2n12

    XN(U,ϕ2):Xu+ϕX

    Box Muller 算法:
    XN(0,1):X=Rcosθ=2lnX1cos(2πX2)

    XN(u,ϕ2):Xu+ϕX

    为了对程序的验证:写下了代码,并且注释:
#include<iostream>
#include<fstream>
#include<ctime>

using namespace std;
const double PI = 3.1415926;
double ND_BoxMuller(double u = 0, double t = 1)
{
    //产生一个随机数
    double x1 = double(rand() )/ RAND_MAX;
    double x2 = double(rand()) / RAND_MAX;
    double x = u + t*sqrt(-2.0*log(x1))*cos(2 * PI*x2);
    //cout << x << "  ";
    return x;
}
double ND_CentralLimit(double u, double t)
{
    //随机数
    double total = 0;
    for (int i = 0; i < 12; i++)//计算12个【0,1】均匀分布的随机数之和
        total += double(rand()) / RAND_MAX;
    double x = u + t*(total - 6);//n=12,n/2=6
    return x;
}
void showRandom(double arr[], int num)
{
    for (int i = 0; i < num; i++)
        cout << arr[i] << endl;
}
void DatatoFile(double a[], double b[], int num)
{
    //将俩种方法产生的1000个随机数按spss的txt格式写入文件
    ofstream out("SPSS数据.txt");
    for (int i = 0; i < num; i++)
        out << a[i] << " " << b[i] << endl;
    out.close();
}
int main()
{
    const int N = 1000;//随机1000个数
    double Xm[N], Xc[N];//存储生成的随机数
    double u = 2.0, t = 3.5;//均值u和方差t
    srand((unsigned int)time(0));
    for (int i = 0; i < N; i++)
    {
        Xm[i] = ND_BoxMuller(u, t);
        Xc[i] = ND_CentralLimit(u, t);
    }
    DatatoFile(Xm, Xc, N);
    cout << "Box Muller算法:" << endl;
    showRandom(Xm, 5);
    cout << "中心极限算法" << endl;
    showRandom(Xc, 5);
    system("pause");
    return 0;
}

然后我用spass,一脸懵逼,怎么用,乱捣鼓为

这里写图片描述

就这样了,有空再来玩。

实训七信息的加密与解密

此篇的加密解密,是根据异或数字得到的,再异或一次得到初始信息。可根据RC4流密码,差不多。

实训八最小二乘法拟合直线

LinearFit(double abr[],double x[],double y[],int n)//abr存放的abr三个值的数组,x是x的值,y是y的值
{
    double xsum=0,ysum=0,x2sum=0,xysum=0;//分别进行存储值
    for(int i=0;i<n;i++)
    {
        xsum+=x[k];
        ysum+=y[k];
        x2sum+=x[k]*x[k];
        xysum+=x[k]*y[k];
    }
    abr[0]=(n*xysum-xsum*ysum)/(n*x2sum-xsum*xsum);//系数a
    abr[1]=(ysum-abr[0]*xsum)/n;//系数b
    double yavg=ysum/n;
    double dy2sum1=0;dy2sum2=0;//$r^2$计算式的分子分母
    for(int i=0;i<n;i++)
    {
        dy2sum1+=((abr[0]*x[k]+abr[1])-yavg)*((abr[0]*x[k]+abr[1])-yavg);
        dy2sum2+=(y[k]-yavg)*(y[k]-yayg);
    }
    abr[2]=dy2sum1/dy2sum2;//相关系数r^2
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值