数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3208|回复: 1

数值计算程序大放送-随机数生成

[复制链接]
发表于 2005-1-19 22:54:40 | 显示全部楼层 |阅读模式
<>选自&lt;&lt;徐世良数值计算程序集(C)&gt;&gt;</P>
<>每个程序都加上了适当地注释,陆陆续续干了几个月才整理出来的啊。</P>
<>今天都给贴出来了</P>
<P>#include &lt;math.h&gt;</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&lt;=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&lt;k)
{
  l=l+l;
}
    m=4*l;
k=*r;
i=1;
    while (i&lt;=1)
{
  k=k+k+k+k+k;
  k=k%m;
  l=k/4+a;
        if (l&lt;=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&lt;k)
{
  l=l+l;
}
    m=4*l;
k=*r;
i=0;
    while (i&lt;=n-1)
{
  k=k+k+k+k+k;
  k=k%m;
  l=k/4+a;
        if (l&lt;=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&lt;=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&lt;=n-1; k++)
{
  t=0.0;
        for (i=1; i&lt;=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>
 楼主| 发表于 2005-1-19 22:54:56 | 显示全部楼层
//////////////////////////////////////////////////////////////
//[0,1]区间内均匀分布的随机双精度浮点数
//r-指向随机整数种子的指针
double mrnd1(double *r);
//////////////////////////////////////////////////////////////
//[0,1]区间内均匀分布的随机双精度浮点数序列
//r-指向随机整数种子的指针
//n-随机序列的长度
//p-长度为n的数组,返回时存放随机序列
double mrnds(double *r,double p,int n);
//////////////////////////////////////////////////////////////
//任意区间内均匀分布的随机整数
//a-区间的左端点
//b-区间的右端点
//r-指向随机数种子的指针
double mrab1(int a,int b,int *r);
//////////////////////////////////////////////////////////////
//任意区间内均匀分布的随机整数序列
//a-区间的左端点
//b-区间的右端点
//r-指向随机整数种子的指针
//n-随机序列的长度
//p-长度为n的数组,返回时存放随机整数序列
double mrab1(int a,int b,int *r,int p[],int n);
//////////////////////////////////////////////////////////////
//任意均值与方差的正态分布随机数
//u-正态分布的均值
//g-正态分布的方差
//r-指向随机数种子的指针
double mgrn1(double u,double g,double *r);
//////////////////////////////////////////////////////////////
//任意均值与方差的正态分布随机数序列
//u-正态分布的均值
//g-正态分布的方差
//r-指向随机数种子的指针
//n-随机序列的长度
//a-长度为n的数组,返回时存放随机数序列
double mgrns(double u,double g,double *r,int n,double a[]);
//////////////////////////////////////////////////////////////
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 21:47 , Processed in 0.051783 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表