线性同余法产生随机数
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]为上一次保存的改变后的种子。
说明:程序主要是参考一本很老的书《数字信号处理的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="" />
相关文章推荐
- 团购码,你知多少?——线性同余产生随机数
- 随机数生成器与线性同余法产生随机数
- 纯线性同余随机数生成器 http://www.cnblogs.com/xkfz007/archive/2012/03/27/2420154.html
- 纯线性同余随机数生成器
- 线性同余算法以及java中随机数的实现分析
- 线性同余随机数生成器
- 迭代取中法、乘同余法及混合同余法产生随机数方法
- 如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些比较是多余的,
- 转载 - 纯线性同余随机数生成器
- 【随机数生成算法系列】线性同余法和梅森旋转法
- 迭代取中法,线性同余法及混合同余法产生伪随机数方法的scilab实现
- 纯线性同余随机数生成器
- 纯线性同余随机数生成器
- 线性同余生成随机数的一点思考
- 线性同余 - 随机数
- 线性同余法取随机数
- 纯线性同余随机数生成器
- 随机数 -- 线性同余
- 用线性同余法生成“伪”随机数
- 随机数种子”和“伪随机数”的产生原理