#include<stdio.h>
double Rand01(double *r)
{
double base,u,v,p,temp1,temp2,temp3;
base=256.0;
u=999.0;
v=199.0;
temp1=u*(*r)+v;//计算总值
temp2=(int)(temp1/base);//计算商
temp3=temp1-temp2*base;//计算余数
*r=temp3;//更新随机种子,便于下一次使用
p=*r/base;//随机数
return p;
}
void main()
{
int i;
double r;
r=100.0;
printf("产生10个【0,1】之间的随机数:\n");
for(i=0;i<10;i++)
{
printf("%10.5lf\n",Rand01(&r));
}
printf("\n");
}
运行结果:
产生10个【0,1】之间的随机数:
0.01172
0.48438
0.66797
0.07813
0.82422
0.17188
0.48047
0.76563
0.63672
0.85938
请按任意键继续. . .
任意随机数的产生
上面那个算法是最基本的算法,我们可以根据需要产生任意范围内的随机数。例如需要一个[m,n]之内的浮点随机数,可以采用m+(n-m)*Rand01(&r)获得:例如如下示例:
#include<stdio.h>
double Rand01(double *r)
{
double base,u,v,p,temp1,temp2,temp3;
base=256.0;
u=999.0;
v=199.0;
temp1=u*(*r)+v;//计算总值
temp2=(int)(temp1/base);//计算商
temp3=temp1-temp2*base;//计算余数
*r=temp3;//更新随机种子,便于下一次使用
p=*r/base;//随机数
return p;
}
void main()
{
int i;
double r,m,n;
r=100.0;
m=10.0;
n=20.0;
printf("产生10个【10,20】之间的随机数:\n");
for(i=0;i<10;i++)
{
printf("%10.5lf\n",m+(n-m)*Rand01(&r));
}
printf("\n");
}
运行结果:
产生10个【10,20】之间的随机数:
10.11719
14.84375
16.67969
10.78125
18.24219
11.71875
14.80469
17.65625
16.36719
18.59375
请按任意键继续. . .
正态分布随机输的产生![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dbad2b921bd1137a196d79966dcf02e5.jpeg)
#include<stdio.h>
double Rand01(double *r)
{
double base,u,v,p,temp1,temp2,temp3;
base=256.0;
u=999.0;
v=199.0;
temp1=u*(*r)+v;
temp2=(int)(temp1/base);
temp3=temp1-temp2*base;
*r=temp3;
p=*r/base;
return p;
}
double RandZT(double u,double t,double *r)
{
int i;
double total=0.0;
double result;
for(i=0;i<12;i++)
{
total+=Rand01(r);//累加
}
result=u+t*(total-6.0);
return result;
}
void main()
{
int i;
double r,u,t;
r=100.0;
u=2.0;
t=3.5;
printf("产生10个正态分布的随机数:\n");
for(i=0;i<10;i++)
{
printf("%.6lf\n",RandZT(u,t,&r));
}
printf("\n");
}
运行结果:
产生10个正态分布的随机数:
1.042969
1.042969
4.542969
4.542969
-2.457031
1.042969
1.042969
4.542969
4.542969
1.042969
请按任意键继续. . .