|
<>选自<<徐世良数值计算程序集(C)>></P>
<>每个程序都加上了适当地注释,陆陆续续干了几个月才整理出来的啊。</P>
<>今天都给贴出来了</P>
<P>#include <math.h></P>
<P>//[0,1]区间内均匀分布的随机双精度浮点数
//r-指向随机整数种子的指针
double mrnd1(double *r)
{
int m;
double s,u,v,p;
s=65536.0;
u=2053.0;
v=13849.0;
m=(int)(*r/s);
*r=*r-m*s;
*r=u*(*r)+v;
m=(int)(*r/s);
*r=*r-m*s;
p=*r/s;
return(p);
}
//[0,1]区间内均匀分布的随机双精度浮点数序列
//r-指向随机整数种子的指针
//n-随机序列的长度
//p-长度为n的数组,返回时存放随机序列
double mrnds(double *r,double p,int n)
{
int i,m;
double s,u,v;
s=65536.0;
u=2053.0;
v=13849.0;
for (i=0; i<=n-1; i++)
{
*r=u*(*r)+v;
m=(int)(*r/s);
*r=*r-m*s;
p=*r/s;
}
return;
}
//任意区间内均匀分布的随机整数
//a-区间的左端点
//b-区间的右端点
//r-指向随机数种子的指针
double mrab1(int a,int b,int *r)
{
int k,l,m,i,p;
k=b-a+1;
l=2;
while (l<k)
{
l=l+l;
}
m=4*l;
k=*r;
i=1;
while (i<=1)
{
k=k+k+k+k+k;
k=k%m;
l=k/4+a;
if (l<=b)
{
p=l;
i=i+1;
}
}
*r=k;
return(p);
}
//任意区间内均匀分布的随机整数
//a-区间的左端点
//b-区间的右端点
//r-指向随机整数种子的指针
//n-随机序列的长度
//p-长度为n的数组,返回时存放随机整数序列
double mrab1(int a,int b,int *r,int p[],int n)
{
int k,l,m,i;
k=b-a+1;
l=2;
while (l<k)
{
l=l+l;
}
m=4*l;
k=*r;
i=0;
while (i<=n-1)
{
k=k+k+k+k+k;
k=k%m;
l=k/4+a;
if (l<=b)
{
p=l;
i=i+1;
}
}
*r=k;
return;
}
//任意均值与方差的正态分布随机数
//u-正态分布的均值
//g-正态分布的方差
//r-指向随机数种子的指针
double mgrn1(double u,double g,double *r)
{
int i,m;
double s,w,v,t;
s=65536.0;
w=2053.0;
v=13849.0;
t=0.0;
for (i=1; i<=12; i++)
{
*r=(*r)*w+v;
m=(int)(*r/s);
*r=*r-m*s;
t=t+(*r)/s;
}
t=u+g*(t-6.0);
return(t);
}
//任意均值与方差的正态分布随机数序列
//u-正态分布的均值
//g-正态分布的方差
//r-指向随机数种子的指针
//n-随机序列的长度
//a-长度为n的数组,返回时存放随机数序列
double mgrns(double u,double g,double *r,int n,double a[])
{
int i,k,m;
double s,w,v,t;
s=65536.0;
w=2053.0;
v=13849.0;
for (k=0; k<=n-1; k++)
{
t=0.0;
for (i=1; i<=12; i++)
{
*r=(*r)*w+v;
m=(int)(*r/s);
*r=*r-m*s; t=t+(*r)/s;
}
a[k]=u+g*(t-6.0);
}
return;
}</P> |
|