您的位置:首页 > 其它

线性同余法产生随机数

2014-12-20 10:02 337 查看
使用线性同余法产生均匀分布的随机数

说明:程序主要是参考一本很老的书《数字信号处理的C语言程序集》,大连理工大学殷福亮,宋爱军老师编写,很不错,大家可以看一下,一些基础的信号处理方法上面都有,以后有程序是参考此书中的就不再另做说明。

线性同余法主要是运用取模的运算来获取随机数,是一种在一些要求较低的场合能基本满足产生均匀分布随机数的方法。

假设要产生[a,b]区间的随机数。

设一种子X[0],产生随机书时会保存下这一次的种子改变后的值X[i],以便下一次使用。

X[i]=(a*x[i-1]+c)<mod M> ;大家注意不要将取模和取余弄混了。

Y[i]=X[i]/M

Z[i]=a+(b-a)*Y[i]

则Z[i]就是我们要产生的在区间[a,b]的随机数。

其中M是取得一个很大的常数,c也是一个常数,x[i-1]为上一次保存的改变后的种子。

double uniform(double a, double b, long int *seed)
{
double t;
double x;
*seed=2045*(*seed)+1;
*seed=*seed-(*seed/1048576)*1048576;
t=(*seed)/1048576.0;
t=a+(b-a)*t;
return t;
}

/*产生[1,100]的随机数*/
void run_uniform()
{
int i;
long int s;
double x;
double a,b;
a=1;
b=100;
s=1000;
for(i=0; i<=10; i++)
{
x=uniform(a,b,&s);
                printf("%.10f\r\n", x);

}
}

运行结果:
<img src="http://img.blog.csdn.net/20141220103231224?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT3B0aWNhbFNvbGl0b24=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: