使用 C 语言产生正态分布的随机数
程序员文章站
2024-03-25 21:27:40
...
在 MATLAB 当中,产生随机数是一件很容易的事情。但是在 C 语言中,则需要自己编程。我修改了《常用算法程序集(C语言描述)》这本书中相关的源代码,并将产生的随机数数列保存在 record.txt 文件中,使用 MATLAB 画出直方图验证了程序的正确性。关于代码的解释,之后再补充。C 语言代码如下:
// C语言产生正态分布随机数的源代码
#include "stdio.h"
double grn1(double u,double g,double *r) //产生单个随机数
{
int i,m;
double s,w,v,t;
s=65536.0;
w=2053.0;
v=13849.0;
t=0.0;
for (i=1; i<=12; i++)
{
*r=(*r)*w+v;
m=(int)(*r/s);
*r=*r-m*s;
t=t+(*r)/s;
}
t=u+g*(t-6.0);
return(t);
}
void grns(double u,double g,double *r,int n,double a[]) //产生随机数数列
{
int i,k,m;
double s,w,v,t;
s=65536.0;
w=2053.0;
v=13849.0;
for (k=0; k<=n-1; k++)
{
t=0.0;
for (i=1; i<=12; i++)
{
*r=(*r)*w+v;
m=(int)(*r/s);
*r=*r-m*s;
t=t+(*r)/s;
}
a[k]=u+g*(t-6.0);
}
return;
}
void main(void)
{
//这个代码是产生单个随机数的
/*
int i,j;
double u,g,r;
double rand_num;
r=5.0; u=1.0; g=1.5;
printf("\n");
for (i=0; i<=9; i++)
{
for (j=0; j<=4; j++)
{
rand_num = grn1(u,g,&r);
printf("%10.7lf ",rand_num);
}
printf("\n");
}
printf("\n");
*/
//下面的代码是产生随机数数列的
int i,j;
double u,g,r,a[30000]; //a数列用来存储产生的随机数
FILE *fp;
r=3.0; //设定随机数产生的种子
u=1.0; //正态分布的均值
g=1.5; //正态分布的方差为g的平方
printf("\n");
grns(u,g,&r,30000,a);
fp = fopen("record.txt","w");
for (i=0; i<=2999; i++)
{
for (j=0; j<=9; j++)
{
if (j==9)
{
printf("%10.7lf",a[i*5+j]);
fprintf(fp,"%10.7lf",a[i*5+j]); //保存到record.txt文件中,便于MATLAB画图
}else{
printf("%10.7lf ",a[i*5+j]);
fprintf(fp,"%10.7lf ",a[i*5+j]);
}
}
printf("\n");
fprintf(fp,"\n");
}
printf("\n");
fclose(fp);
getchar();
}
通过上述的代码,就可以在程序所在目录下的 record.txt 文件中保存下来产生的 30000 个随机数,文本文件中的内容是这样的:
我们在 MATLAB 中写一些代码来统计这些数字。MATLAB 程序如下:
close all;
clear all;
clc;
rand_num = textread('record.txt');
set(0,'defaultfigurecolor','w')
[counts,centers]=hist(rand_num,300);
bar(centers,counts,1);
可以看到输出的统计直方图如下:
从图可以看出,数据大致呈现正态分布,这表明我们的程序是正确的。