数字信号的产生(1)-混合同余法产生均匀随机数
关于随机数这块的算法来源于殷福亮、宋爱军——《数字信号处理C语言程序集》。
博文的目的主要是针对书中的一些C算法原理做一定的阐述,部分内容来源于收集的材料。
程序平台:Debian/Win7 + Eclipse(C/C++ Developers) + Mingw GCC
程序语言:C Language
相关知识:概率论 + 高等数学
作者语:
有关《数字信号处理C语言算法》这个系列,由于原书大多只提供算法公式,对于公式背后的原理,并没有细讲解,所以,自己不得不参考很多书籍,有些地方甚至改了4遍,仍不满意。为了使这个系列具有很强的专业性和实用性,有关文章只有很成熟时,才会发表在博文中,因此,更新会比较慢。
这个系列的文章,本来是准备在Debian7系统下完成的,但由于缺少相应的公式编辑器,所以选择Win7,Debian7下只做部分算法的验证部分;当 然,公式的验证也可采用Excel,Origin等工具,不会有任何差异;如果只是用于C/C++普通编程,在Win7下建议使用eclipse for c/c++ ;使用Debian7的朋友,系统自带vim就是很好的工具。
由于博文中公式较多,而网页不支持公式编辑器格式,所以将公式有关部分,全部截图,作为网页内容,如果有不清楚的地方,可以给我留言。
1. 均匀分布随机数:
2. 混合同余法:
通过同余运算生成伪随机数的方法称为同余法,常用的同余法包括加同余法、乘同余法、混合同余法、除同余法,其迭代公式为:
3. 混合同余法特点:
4. 欧拉函数
5. 原根
6. uniform.h函数分析:
附:源码
#ifndef UNIFORM_H #define UNIFORM_H double uniform(int a,int b,long int *seed); //*seed 任意的种子数 //随机数的值区间:a~b double uniform(int a,int b,long int *seed) { double t; *seed = 2045*(*seed)+1; *seed = *seed-(*seed/1048576)*1048576; t=(*seed)/1048576.0; t=a+(b-a)*t; return(t); } #endif
7. eclipse中例程生成效果:
8. 一个检测七彩球的例程(点击下载附件)