您的当前位置:首页正文

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

来源:独旅网


方法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;

}

因篇幅问题不能全部显示,请点此查看更多更全内容