user-0 提问: 线性同余法生成随机数，摘自国外论文

回复:
user: user-1
content: 不太懂，不过这里有一个方法：  http://blog.csdn.net/memray/article/details/8932518

user: user-2
content: #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

user: user-3
content: 在http://www.codeproject.com搜“Random Number Generation Methods”

user: user-1
content: 引用 10 楼 peyton_tang 的回复:谢谢，刚刚改了一下，发现seed只变了第一次值，后面就没发生变化了哈哈

user: user-1
content: 引用 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] 其实我个人对这个算法一知半解，我自己都不确定我说的是否正确，最好是等高手来看看。

user: user-1
content: 引用 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";}}}  应当是对的，每次计算后要做更改。

user: user-1
content: 引用 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";}}}  种子我一般是以时间来取。具体的还真不知道了。。

user: user-0
content: 引用 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只变了第一次值，后面就没发生变化了哈哈

user: user-0
content: 引用 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已经发生了改变了是吧，谢谢

user: user-0
content: 引用 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   麻烦您看一下我四楼的更改，我改了一下数据类型，但是依然没有很好的随机

user: user-0
content: 引用 2 楼 zjq9931 的回复:不太懂，不过这里有一个方法：  http://blog.csdn.net/memray/article/details/8932518 麻烦你。看一下我三楼的回复谢谢

user: user-0
content: 谢谢，这个方法我看过了，主要我是想运用上面我从论文摘出的方法，目前来说，我是发现了自己一部分问题，但是还是有问题，不过有一个疑问，我这里面用个的这个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";}}}