简单的随机数生成与测试程序.docVIP

  • 6
  • 0
  • 约2.48千字
  • 约 6页
  • 2017-01-30 发布于重庆
  • 举报
简单的随机数生成与测试程序

方法1 //线性同余法产生随机数 //直接使用rand函数 #includestdio.h #includestdlib.h #includetime.h int main() { int i=0; int r; FILE *fp; fp=fopen(D:\\out.txt,w); srand(time(0)); for(;i1000;i++) { r=rand()%65535; srand(r); fprintf(fp,%5d\n,r%65535); } fclose(fp); } 方法2 //线性同余法产生随机数 //添加质数 #includestdio.h #includestdlib.h #includetime.h int main() { int i=0; int r; FILE *fp; fp=fopen(D:\\out.txt,w); srand(time(0)); for(;i1000;i++) { r=(rand()*541+9521)%65535;//加质数 线性方程 srand(73*r+43);//加质数 线性方程 fprintf(fp,%5d\n,r%65535); } fclose(fp); } 方法3 //线性同余法产生随机数 //自己使用合理的质数构造线性同余方程 #includestdio.h #includetime.h int main() { int i=0; int r; FILE *fp; fp=fopen(D:\\out.txt,w); r=time(0)%65535; for(;i10000;i++) { r=(r*541+9521)%65535;//加质数 线性方程 fprintf(fp,%5d\n,r); } fclose(fp); } 方法4 //线性同余法产生随机数 //自己使用合理的质数和大数N 构造线性同余方程 #includestdio.h #includetime.h int main() { int i=0; unsigned int r; FILE *fp; fp=fopen(D:\\out.txt,w); r=time(0); for(;i10000;i++) { r=r*541+9521;//加质数 线性方程 fprintf(fp,%u\n,r%65535); } fclose(fp); } 结果表明,方法4是最好的,不会重复。前三种方法由于所模的大数N不够大,导致生成周期太小,容易重复。但是,个人认为,C语言中随机数生成函数比较难用,一不小心就容易得到不好的结果,也有人竟然不知道使用SRAND的。就算正确使用了线性同余法,生成的伪随机数有一定的线性相关性,性能也不是特别好,解决方法就是再对生成的数进行非线性变换。 //线性同余法产生随机数 //再经过非线性变换去除相关性 #includestdio.h #includetime.h int main() { int i=0; unsigned int r; int k=7331; FILE *fp; fp=fopen(D:\\out.txt,w); r=time(0); for(;i10000;i++) { r=r*7+9521;//加质数 线性方程 k=k*29+2251; fprintf(fp,%u\n,(r^(2017+17*i)^k)%65535); } fclose(fp); } 附带一个简单的随机数测试程序,有注释,很容易看懂! //随机数测试求PI法 #includestdio.h #includestdlib.h #includetime.h #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;inum;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;

文档评论(0)

1亿VIP精品文档

相关文档