因为已经放假,所以很多内容因为学过而省略
实训五 一元多项式的存储与计算
f(x)=anxn+an−1xn−1⋅⋅⋅+a1x+a0
进行对此方程的计算:
思路,对
an
的这些数进行double存储。然后分解f(x)函数。类似:
f(x)=((((akx+ak−1)x+ak−2)x+ak−3)x+⋅⋅⋅+a1+a0
或者直接计算。很简单。
实训六生成正态分布的伪随机数
随机数的生成使用
1.用srand(time(0))初始化随机种子
2.使用rand()函数。生成随机数个数
rand函数的返回值是伪随机数,在范围0~RAND_MAX内均匀分布,RAND_MAX是十进制32767 .为使每次生词的随机数序列不同,所以需要在rand()之前用系统时间指定随机种子。。
生成区间[a,b]的使用办法,rand()%(b-a)+a;
- 生成服从正态分布的随机数
概率密度函数:
f(x)=1ϕ2π−−√exp(−(x−u)22ϕ2)
分布函数:
F(x)=∫X∞f(t)dt
中心极限定理:
x~n(0,1)
X=∑n−1i=0−n2n12−−√
X∼N(U,ϕ2):X←u+ϕX
Box Muller 算法:
X∼N(0,1):X=Rcosθ=−2lnX1−−−−−−√cos(2πX2)
X∼N(u,ϕ2):X←u+ϕ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
}