任意随机数以及正态分布随机数的产生

在这里插入图片描述

#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

请按任意键继续. . .

正态分布随机输的产生在这里插入图片描述

#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

请按任意键继续. . .

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值