线性同余法生成随机数,摘自国外论文

peyton_tang 2017-09-21 07:33:27
下面是从一篇国外论文里找出来的随机数程序,线性同余法,可是我运算之后都是0,为什么,请大神指点,而且有一行有警告:
#include<iostream.h>
#include<math.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long seed1=25;
static long seed2=12;
static long seed3=60;
long ran2(long *idum)
{
int j;
long k;
static long idum2=123456789;
long *p=&idum2;
static long iy=0;
static long iv[NTAB] ;
long temp;
if (*idum<=0) /* 初始化 */
{
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
*p=(*idum);
for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
{
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
{*idum+=IM1;}
if (j<NTAB)
{iv[j]=*idum;}
}
iy=iv[0];
}
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
{*idum+=IM1;
k=idum2/IQ2 ;
idum2=IA2*(idum2-k*IQ2)-k*IR2;}
if (idum2<0) {idum2+=IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j]=*idum;}
if (iy<1) {iy+=IMM1;}
if ((temp=AM*iy)>RNMX) return RNMX;
/* '=' : conversion from 'double' to 'long', possible loss of data*/
else return temp;
}

long rnd_gen2(long *seed)
{int p;
long sum=0;
for (p=0;p<12;p++)
{
sum+=ran2(seed);

}
sum-=ran2(seed);
return sum;

}

void main()
{
int j,k;
long rndx[5][8];
long rndy[5][8];
long rndz[5][8];
long *a1;
long *a2;
long *a3;
a1=&seed1;
a2=&seed2;
a3=&seed3;
for(j=0;j<5;j++)
{for(k=0;k<8;k++)
{rndx[j][k]=rnd_gen2(a1);
rndy[j][k]=rnd_gen2(a1);
rndz[j][k]=rnd_gen2(a1);
cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";}
}
}
...全文
440 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不太懂,不过这里有一个方法:

http://blog.csdn.net/memray/article/details/8932518
自信男孩 2017-09-22
  • 打赏
  • 举报
回复
#include<iostream>
#include<math.h>

using namespace std;

#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

static long seed1=25;
static long seed2=12;
static long seed3=60;

long ran2(long *idum)
{
    int j;
    long k;
    static long idum2=123456789;
    long *p=&idum2;
    static long iy=0;
    static long iv[NTAB] ;
    long temp;

    if (*idum<=0)  /* 初始化 */
    {
        if (-(*idum)<1) *idum=1;
        else *idum=-(*idum);
        *p=(*idum);
        for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
        {
            k=(*idum)/IQ1;
            *idum=IA1*(*idum-k*IQ1)-k*IR1;
            if (*idum<0)
            {*idum+=IM1;}
            if (j<NTAB)
            {iv[j]=*idum;}
        }
        iy=iv[0];
    }
    k=(*idum)/IQ1;
    *idum=IA1*(*idum-k*IQ1)-k*IR1;
    if (*idum<0)
    {*idum+=IM1;
        k=idum2/IQ2 ;
        idum2=IA2*(idum2-k*IQ2)-k*IR2;}
    if (idum2<0) {idum2+=IM2;
        j=iy/NDIV;
        iy=iv[j]-idum2;
        iv[j]=*idum;}
    if (iy<1) {iy+=IMM1;}
    if ((temp=AM*iy)>RNMX)
        return RNMX;
    else return temp;
}

long rnd_gen2(long *seed)
{int p;
    long sum=0;
    for (p=0;p<12;p++)
    {
        sum+=ran2(seed);

    }
    sum-=ran2(seed);
    return sum;

}

int main(void)
{
    int j,k;
    long rndx[5][8];
    long rndy[5][8];
    long rndz[5][8];
    long *a1;
    long *a2;
    long *a3;
    a1=&seed1;
    a2=&seed2;
    a3=&seed3;
    for(j=0;j<5;j++)
    {
        for(k=0;k<8;k++)
        {
            rndx[j][k]=rnd_gen2(a1);
            rndy[j][k]=rnd_gen2(a1);
            rndz[j][k]=rnd_gen2(a1);
            cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";
        }
    }

    return 0;
}
运行结果:
0,0 0,0,0
0,1 0,0,0
0,2 0,0,0
0,3 0,0,0
0,4 0,0,0
0,5 0,0,0
0,6 0,0,0
0,7 0,0,0
1,0 0,0,0
1,1 0,0,0
1,2 0,0,0
1,3 0,0,0
1,4 0,0,0
1,5 0,0,0
1,6 0,0,0
1,7 0,0,0
2,0 0,0,0
2,1 0,0,0
2,2 0,0,0
2,3 0,0,0
2,4 0,0,0
2,5 0,0,0
2,6 0,0,0
2,7 0,0,0
3,0 0,0,0
3,1 0,0,0
3,2 0,0,0
3,3 0,0,0
3,4 0,0,0
3,5 0,0,0
3,6 0,0,0
3,7 0,0,0
4,0 0,0,0
4,1 0,0,0
4,2 0,0,0
4,3 0,0,0
4,4 0,0,0
4,5 0,0,0
4,6 0,0,0
4,7 0,0,0
赵4老师 2017-09-22
  • 打赏
  • 举报
回复
http://www.codeproject.com搜“Random Number Generation Methods”
  • 打赏
  • 举报
回复
引用 10 楼 peyton_tang 的回复:
谢谢,刚刚改了一下,发现seed只变了第一次值,后面就没发生变化了哈哈
  • 打赏
  • 举报
回复
引用 8 楼 peyton_tang 的回复:
[quote=引用 7 楼 zjq9931 的回复:] [quote=引用 3 楼 peyton_tang 的回复:] 谢谢,这个方法我看过了,主要我是想运用上面我从论文摘出的方法,目前来说,我是发现了自己一部分问题,但是还是有问题,不过有一个疑问,我这里面用个的这个seed1是个初始值,我用了指针变量想使seed得原值在每次运算后改变,不知道我的方法是对的么?自己现在这个貌似有点不一样,但是结果并没有紧接着下一个随机
#include<iostream.h>
#include<math.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014                     
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791                      
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long seed1=25;
static long seed2=66;
static long seed3=60;
double ran2(long *idum)
{
int j;
long k;                                                  
static long idum2=123456789;

static long iy=0;
static long iv[NTAB] ;
float temp;
if (*idum<=0)  /* 初始化 */
{
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
idum2=(*idum);
for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
{
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)  
*idum+=IM1;
if (j<NTAB) 
iv[j]=*idum; 
}
iy=iv[0];
}                                                          
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
 {*idum+=IM1;
k=idum2/IQ2 ;
idum2=IA2*(idum2-k*IQ2)-k*IR2;}
if (idum2<0) {idum2+=IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j]=*idum;}
if (iy<1) {iy+=IMM1;}
if ((temp=AM*iy)>RNMX) return RNMX;
else return temp;
} 




void main()
{
int j,k;
double rndx[30][30];
double rndy[30][30];
double rndz[30][30];
long *a1;
long *a2;
long *a3;
a1=&seed1;
a2=&seed2;
a3=&seed3;
for(j=0;j<30;j++)
{for(k=0;k<30;k++)
{rndx[j][k]=ran2(a1);
rndy[j][k]=ran2(a1);
rndz[j][k]=ran2(a1);
}
}
for(j=0;j<10;j++)
{for(k=0;k<30;k++)
{cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";}}} 
应当是对的,每次计算后要做更改。[/quote]也就是说我这里的seed已经发生了改变了是吧,谢谢[/quote] 其实我个人对这个算法一知半解,我自己都不确定我说的是否正确,最好是等高手来看看。
  • 打赏
  • 举报
回复
引用 3 楼 peyton_tang 的回复:
谢谢,这个方法我看过了,主要我是想运用上面我从论文摘出的方法,目前来说,我是发现了自己一部分问题,但是还是有问题,不过有一个疑问,我这里面用个的这个seed1是个初始值,我用了指针变量想使seed得原值在每次运算后改变,不知道我的方法是对的么?自己现在这个貌似有点不一样,但是结果并没有紧接着下一个随机
#include<iostream.h>
#include<math.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014                     
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791                      
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long seed1=25;
static long seed2=66;
static long seed3=60;
double ran2(long *idum)
{
int j;
long k;                                                  
static long idum2=123456789;

static long iy=0;
static long iv[NTAB] ;
float temp;
if (*idum<=0)  /* 初始化 */
{
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
idum2=(*idum);
for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
{
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)  
*idum+=IM1;
if (j<NTAB) 
iv[j]=*idum; 
}
iy=iv[0];
}                                                          
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
 {*idum+=IM1;
k=idum2/IQ2 ;
idum2=IA2*(idum2-k*IQ2)-k*IR2;}
if (idum2<0) {idum2+=IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j]=*idum;}
if (iy<1) {iy+=IMM1;}
if ((temp=AM*iy)>RNMX) return RNMX;
else return temp;
} 




void main()
{
int j,k;
double rndx[30][30];
double rndy[30][30];
double rndz[30][30];
long *a1;
long *a2;
long *a3;
a1=&seed1;
a2=&seed2;
a3=&seed3;
for(j=0;j<30;j++)
{for(k=0;k<30;k++)
{rndx[j][k]=ran2(a1);
rndy[j][k]=ran2(a1);
rndz[j][k]=ran2(a1);
}
}
for(j=0;j<10;j++)
{for(k=0;k<30;k++)
{cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";}}} 
应当是对的,每次计算后要做更改。
  • 打赏
  • 举报
回复
引用 3 楼 peyton_tang 的回复:
谢谢,这个方法我看过了,主要我是想运用上面我从论文摘出的方法,目前来说,我是发现了自己一部分问题,但是还是有问题,不过有一个疑问,我这里面用个的这个seed1是个初始值,我用了指针变量想使seed得原值在每次运算后改变,不知道我的方法是对的么?自己现在这个貌似有点不一样,但是结果并没有紧接着下一个随机
#include<iostream.h>
#include<math.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014                     
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791                      
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long seed1=25;
static long seed2=66;
static long seed3=60;
double ran2(long *idum)
{
int j;
long k;                                                  
static long idum2=123456789;

static long iy=0;
static long iv[NTAB] ;
float temp;
if (*idum<=0)  /* 初始化 */
{
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
idum2=(*idum);
for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
{
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)  
*idum+=IM1;
if (j<NTAB) 
iv[j]=*idum; 
}
iy=iv[0];
}                                                          
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
 {*idum+=IM1;
k=idum2/IQ2 ;
idum2=IA2*(idum2-k*IQ2)-k*IR2;}
if (idum2<0) {idum2+=IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j]=*idum;}
if (iy<1) {iy+=IMM1;}
if ((temp=AM*iy)>RNMX) return RNMX;
else return temp;
} 




void main()
{
int j,k;
double rndx[30][30];
double rndy[30][30];
double rndz[30][30];
long *a1;
long *a2;
long *a3;
a1=&seed1;
a2=&seed2;
a3=&seed3;
for(j=0;j<30;j++)
{for(k=0;k<30;k++)
{rndx[j][k]=ran2(a1);
rndy[j][k]=ran2(a1);
rndz[j][k]=ran2(a1);
}
}
for(j=0;j<10;j++)
{for(k=0;k<30;k++)
{cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";}}} 
种子我一般是以时间来取。具体的还真不知道了。。
peyton_tang 2017-09-22
  • 打赏
  • 举报
回复
引用 9 楼 zjq9931 的回复:
[quote=引用 8 楼 peyton_tang 的回复:] [quote=引用 7 楼 zjq9931 的回复:] [quote=引用 3 楼 peyton_tang 的回复:] 谢谢,这个方法我看过了,主要我是想运用上面我从论文摘出的方法,目前来说,我是发现了自己一部分问题,但是还是有问题,不过有一个疑问,我这里面用个的这个seed1是个初始值,我用了指针变量想使seed得原值在每次运算后改变,不知道我的方法是对的么?自己现在这个貌似有点不一样,但是结果并没有紧接着下一个随机
#include<iostream.h>
#include<math.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014                     
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791                      
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long seed1=25;
static long seed2=66;
static long seed3=60;
double ran2(long *idum)
{
int j;
long k;                                                  
static long idum2=123456789;

static long iy=0;
static long iv[NTAB] ;
float temp;
if (*idum<=0)  /* 初始化 */
{
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
idum2=(*idum);
for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
{
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)  
*idum+=IM1;
if (j<NTAB) 
iv[j]=*idum; 
}
iy=iv[0];
}                                                          
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
 {*idum+=IM1;
k=idum2/IQ2 ;
idum2=IA2*(idum2-k*IQ2)-k*IR2;}
if (idum2<0) {idum2+=IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j]=*idum;}
if (iy<1) {iy+=IMM1;}
if ((temp=AM*iy)>RNMX) return RNMX;
else return temp;
} 




void main()
{
int j,k;
double rndx[30][30];
double rndy[30][30];
double rndz[30][30];
long *a1;
long *a2;
long *a3;
a1=&seed1;
a2=&seed2;
a3=&seed3;
for(j=0;j<30;j++)
{for(k=0;k<30;k++)
{rndx[j][k]=ran2(a1);
rndy[j][k]=ran2(a1);
rndz[j][k]=ran2(a1);
}
}
for(j=0;j<10;j++)
{for(k=0;k<30;k++)
{cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";}}} 
应当是对的,每次计算后要做更改。[/quote]也就是说我这里的seed已经发生了改变了是吧,谢谢[/quote] 其实我个人对这个算法一知半解,我自己都不确定我说的是否正确,最好是等高手来看看。[/quote]谢谢,刚刚改了一下,发现seed只变了第一次值,后面就没发生变化了哈哈
peyton_tang 2017-09-22
  • 打赏
  • 举报
回复
引用 7 楼 zjq9931 的回复:
[quote=引用 3 楼 peyton_tang 的回复:] 谢谢,这个方法我看过了,主要我是想运用上面我从论文摘出的方法,目前来说,我是发现了自己一部分问题,但是还是有问题,不过有一个疑问,我这里面用个的这个seed1是个初始值,我用了指针变量想使seed得原值在每次运算后改变,不知道我的方法是对的么?自己现在这个貌似有点不一样,但是结果并没有紧接着下一个随机
#include<iostream.h>
#include<math.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014                     
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791                      
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long seed1=25;
static long seed2=66;
static long seed3=60;
double ran2(long *idum)
{
int j;
long k;                                                  
static long idum2=123456789;

static long iy=0;
static long iv[NTAB] ;
float temp;
if (*idum<=0)  /* 初始化 */
{
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
idum2=(*idum);
for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
{
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)  
*idum+=IM1;
if (j<NTAB) 
iv[j]=*idum; 
}
iy=iv[0];
}                                                          
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
 {*idum+=IM1;
k=idum2/IQ2 ;
idum2=IA2*(idum2-k*IQ2)-k*IR2;}
if (idum2<0) {idum2+=IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j]=*idum;}
if (iy<1) {iy+=IMM1;}
if ((temp=AM*iy)>RNMX) return RNMX;
else return temp;
} 




void main()
{
int j,k;
double rndx[30][30];
double rndy[30][30];
double rndz[30][30];
long *a1;
long *a2;
long *a3;
a1=&seed1;
a2=&seed2;
a3=&seed3;
for(j=0;j<30;j++)
{for(k=0;k<30;k++)
{rndx[j][k]=ran2(a1);
rndy[j][k]=ran2(a1);
rndz[j][k]=ran2(a1);
}
}
for(j=0;j<10;j++)
{for(k=0;k<30;k++)
{cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";}}} 
应当是对的,每次计算后要做更改。[/quote]也就是说我这里的seed已经发生了改变了是吧,谢谢
peyton_tang 2017-09-22
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
#include<iostream>
#include<math.h>

using namespace std;

#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

static long seed1=25;
static long seed2=12;
static long seed3=60;

long ran2(long *idum)
{
    int j;
    long k;
    static long idum2=123456789;
    long *p=&idum2;
    static long iy=0;
    static long iv[NTAB] ;
    long temp;

    if (*idum<=0)  /* 初始化 */
    {
        if (-(*idum)<1) *idum=1;
        else *idum=-(*idum);
        *p=(*idum);
        for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
        {
            k=(*idum)/IQ1;
            *idum=IA1*(*idum-k*IQ1)-k*IR1;
            if (*idum<0)
            {*idum+=IM1;}
            if (j<NTAB)
            {iv[j]=*idum;}
        }
        iy=iv[0];
    }
    k=(*idum)/IQ1;
    *idum=IA1*(*idum-k*IQ1)-k*IR1;
    if (*idum<0)
    {*idum+=IM1;
        k=idum2/IQ2 ;
        idum2=IA2*(idum2-k*IQ2)-k*IR2;}
    if (idum2<0) {idum2+=IM2;
        j=iy/NDIV;
        iy=iv[j]-idum2;
        iv[j]=*idum;}
    if (iy<1) {iy+=IMM1;}
    if ((temp=AM*iy)>RNMX)
        return RNMX;
    else return temp;
}

long rnd_gen2(long *seed)
{int p;
    long sum=0;
    for (p=0;p<12;p++)
    {
        sum+=ran2(seed);

    }
    sum-=ran2(seed);
    return sum;

}

int main(void)
{
    int j,k;
    long rndx[5][8];
    long rndy[5][8];
    long rndz[5][8];
    long *a1;
    long *a2;
    long *a3;
    a1=&seed1;
    a2=&seed2;
    a3=&seed3;
    for(j=0;j<5;j++)
    {
        for(k=0;k<8;k++)
        {
            rndx[j][k]=rnd_gen2(a1);
            rndy[j][k]=rnd_gen2(a1);
            rndz[j][k]=rnd_gen2(a1);
            cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";
        }
    }

    return 0;
}
运行结果:
0,0 0,0,0
0,1 0,0,0
0,2 0,0,0
0,3 0,0,0
0,4 0,0,0
0,5 0,0,0
0,6 0,0,0
0,7 0,0,0
1,0 0,0,0
1,1 0,0,0
1,2 0,0,0
1,3 0,0,0
1,4 0,0,0
1,5 0,0,0
1,6 0,0,0
1,7 0,0,0
2,0 0,0,0
2,1 0,0,0
2,2 0,0,0
2,3 0,0,0
2,4 0,0,0
2,5 0,0,0
2,6 0,0,0
2,7 0,0,0
3,0 0,0,0
3,1 0,0,0
3,2 0,0,0
3,3 0,0,0
3,4 0,0,0
3,5 0,0,0
3,6 0,0,0
3,7 0,0,0
4,0 0,0,0
4,1 0,0,0
4,2 0,0,0
4,3 0,0,0
4,4 0,0,0
4,5 0,0,0
4,6 0,0,0
4,7 0,0,0
麻烦您看一下我四楼的更改,我改了一下数据类型,但是依然没有很好的随机
peyton_tang 2017-09-22
  • 打赏
  • 举报
回复
引用 2 楼 zjq9931 的回复:
不太懂,不过这里有一个方法:

http://blog.csdn.net/memray/article/details/8932518
麻烦你。看一下我三楼的回复谢谢
peyton_tang 2017-09-22
  • 打赏
  • 举报
回复
谢谢,这个方法我看过了,主要我是想运用上面我从论文摘出的方法,目前来说,我是发现了自己一部分问题,但是还是有问题,不过有一个疑问,我这里面用个的这个seed1是个初始值,我用了指针变量想使seed得原值在每次运算后改变,不知道我的方法是对的么?自己现在这个貌似有点不一样,但是结果并没有紧接着下一个随机
#include<iostream.h>
#include<math.h>
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014                     
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791                      
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long seed1=25;
static long seed2=66;
static long seed3=60;
double ran2(long *idum)
{
int j;
long k;                                                  
static long idum2=123456789;

static long iy=0;
static long iv[NTAB] ;
float temp;
if (*idum<=0)  /* 初始化 */
{
if (-(*idum)<1) *idum=1;
else *idum=-(*idum);
idum2=(*idum);
for (j=NTAB+7;j>=0;j--) /* 负荷转移表,载入洗牌表 */
{
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)  
*idum+=IM1;
if (j<NTAB) 
iv[j]=*idum; 
}
iy=iv[0];
}                                                          
k=(*idum)/IQ1;
*idum=IA1*(*idum-k*IQ1)-k*IR1;
if (*idum<0)
 {*idum+=IM1;
k=idum2/IQ2 ;
idum2=IA2*(idum2-k*IQ2)-k*IR2;}
if (idum2<0) {idum2+=IM2;
j=iy/NDIV;
iy=iv[j]-idum2;
iv[j]=*idum;}
if (iy<1) {iy+=IMM1;}
if ((temp=AM*iy)>RNMX) return RNMX;
else return temp;
} 




void main()
{
int j,k;
double rndx[30][30];
double rndy[30][30];
double rndz[30][30];
long *a1;
long *a2;
long *a3;
a1=&seed1;
a2=&seed2;
a3=&seed3;
for(j=0;j<30;j++)
{for(k=0;k<30;k++)
{rndx[j][k]=ran2(a1);
rndy[j][k]=ran2(a1);
rndz[j][k]=ran2(a1);
}
}
for(j=0;j<10;j++)
{for(k=0;k<30;k++)
{cout<<j<<','<<k<<' '<<rndx[j][k]<<','<<rndy[j][k]<<','<<rndz[j][k]<<"\n";}}} 

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧