方法1
//线性同余法产生随机数
//直接使用rand函数
#include #include #include int main() { int i=0; int r; FILE *fp; fp=fopen(\"D:\\\\out.txt\ srand(time(0)); for(;i<1000;i++) { r=rand()%65535; srand(r); fprintf(fp,\"%5d\\n\ } fclose(fp); } 方法2 //线性同余法产生随机数 //添加质数 #include #include #include int main() { int i=0; int r; FILE *fp; fp=fopen(\"D:\\\\out.txt\ srand(time(0)); for(;i<1000;i++) { r=(rand()*541+9521)%65535;//加质数 线性方程 srand(73*r+43);//加质数 线性方程 fprintf(fp,\"%5d\\n\ } fclose(fp); } 方法3 //线性同余法产生随机数 //自己使用合理的质数构造线性同余方程 #include #include int main() { int i=0; int r; FILE *fp; fp=fopen(\"D:\\\\out.txt\ r=time(0)%65535; for(;i<10000;i++) { r=(r*541+9521)%65535;//加质数 线性方程 fprintf(fp,\"%5d\\n\ } fclose(fp); } 方法4 //线性同余法产生随机数 //自己使用合理的质数和大数N 构造线性同余方程 #include #include int main() { int i=0; unsigned int r; FILE *fp; fp=fopen(\"D:\\\\out.txt\ r=time(0); for(;i<10000;i++) { r=r*541+9521;//加质数 线性方程 fprintf(fp,\"%u\\n\ } fclose(fp); } 结果表明,方法4是最好的,不会重复。前三种方法由于所模的大数N不够大,导致生成周期太小,容易重复。但是,个人认为,C语言中随机数生成函数比较难用,一不小心就容易得到不好的结果,也有人竟然不知道使用SRAND的。就算正确使用了线性同余法,生成的伪随机数有一定的线性相关性,性能也不是特别好,解决方法就是再对生成的数进行非线性变换。 //线性同余法产生随机数 //再经过非线性变换去除相关性 #include #include int main() { int i=0; unsigned int r; int k=7331; FILE *fp; fp=fopen(\"D:\\\\out.txt\ r=time(0); for(;i<10000;i++) { r=r*7+9521;//加质数 线性方程 k=k*29+2251; fprintf(fp,\"%u\\n\ } fclose(fp); } 附带一个简单的随机数测试程序,有注释,很容易看懂! //随机数测试求PI法 #include #include #include #define MAX 100000 int gen_rand(int a[],int num,int style) { //srand((int)time(0)); int i; unsigned int r; r=time(0); for(i=0;i r=(r*541+9521)*r+431; a[i]=r%65535; } return 0; } int test_rand(int a[],int num,int style) { float b[MAX]; float ans; int i,t; int l,w; for(i=0;i b[i]=(float)a[i]/65535.0; } l=0; w=0; t=num/2; for(i=0;i if( b[i]*b[i]+b[i+t]*b[i+t]<= 1 ) //即为x^2+y^2>1 该部分的面积为pi/4 l++; else w++; } ans=(float)l/(float)(l+w)*4; printf(\"pi = %f\\n\ } int main() { int a[MAX]; gen_rand(a,MAX,0); test_rand(a,MAX,0); getchar(); return 0; } 因篇幅问题不能全部显示,请点此查看更多更全内容