梦想赌坊的当家(EmilMatthew的博客)

向FC时代的那些伟大的制作人,程序员,音乐家,美术家们致敬!!!

用户操作
[即时聊天] [发私信] [加为好友]
秦盛ID:EmilMatthew
412096次访问,排名120好友46人,关注者42
感动常在
EmilMatthew的文章
原创 294 篇
翻译 4 篇
转载 105 篇
评论 339 篇
秦盛的公告

〖我的作品〗


〖文化视角〗

     1.90年代初的苏州

     2.中国动画80年

     3.古城真定

     4.三国知识问答

     5.大哥陈松勇

     6.圣斗士.终章

     7.武侠配乐.少林雄风

     8.李宗盛.生活家的院子

     9.李敖精彩语录选

     10.安东尼奥尼.中国.剪影.1

     11.安东尼奥尼.中国.剪影.2

     12.林青霞向季老讨文气

     13.山水情.中国水墨动画之巅峰

     14.《人物》之媒体人.刘长乐

     15.侯孝贤谈悲情城市

     16.转.夜泊秦淮近酒家

     17.冯骥才:守望民间文化的精卫鸟


我是一个快乐的赌徒,因为我掷出去的每把骰子,都是自己的,玩的都是真性情。


年轻的朋友们,你还记得自己曾经最真的梦吗?如果有,那不妨去追寻它,实现它,即使努力后失败了,多年之后,回首往事,你必会因为自己当年的那份激情与执著而感动。因为:青春无价... ...



〖宣言〗

前途是光明的

道路是曲折的


〖祈福〗

祝季羡林老先生在301医院身体健康,心情愉快!

祝李敖大师精神矍铄,风采不逊当年,多出新作!

遥祝Bertrand Rusell爷爷在天堂依旧幸福人生!

遥祝Edsger W.Dijkstra爷爷在天堂依然享受最短路径的乐趣!


    〖强烈推荐〗

   ACM图灵奖演讲集

   FF背后的牛人们

   (视频)Dijkstra风采

        〖推荐〗

     0.个人简介

武侠风    新版

     1.1A*算法实践

     1.2A*最优解提取算法

     2.夜间图像增强

  本站相关源码下载











最近评论
bluehouse1985:Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Total……
lulongjiao:想法很好啊,太理想化了把.
六月风暴:快卡死我了倒是真的
tljtian:SF.....不错~
iq263:程序员后花园,累了来看看 http://bbs.iq263.cn/
文章分类
收藏
相册
宋慧乔
我所崇拜的科学家们
我所喜爱的歌手
05大师有大智慧
Alan Kay(Smalltalk,OOP)
BERTRAND RUSSELL
Donald E. Knuth(Art of Algorithm)
Edsger W. Dijkstra(Programming & Algorithm Design,Shortest Path)
John McCarthy(人工智能)
李敖
06闲情,感悟
苏州古城的历史
苏州杂志
读者论坛
赵云庙
07天籁之音
[周华健,李度]难以抗拒
[成龙,苏慧伦]在我生命中的每一天
[成龙]壮志在我胸
[灌篮高手]直到世界的尽头
Somewhere out there
somke gets in your eyes
When You Believe
野风[新龙门客栈片尾曲,林忆莲]
08苏州中学
苏中主页
09算法,数据结构,优化
ACM/ICPC的司令部
Dictionary of Algo&DS
IOI选手优秀论文
Lucky猫的ACM园地
UVA在线答题系统
中国人工智能网
中国数据挖掘网
中国网格信息中转站
中国运筹学协会
信息学初学者之家
信息学奥林匹克基地
北大ACM站
数据结构自考网
浙大ACM站
10科学,论文
Citeseer
Scientific American
Tex中文站
yesize资料坊
上海网上天文台
中国学术期刊网
中国工程院
中国水利期刊
中国知网
中国科学院
大众科普网
奇迹文库
科研中国
集智俱乐部
11名校计算机科学院巡礼
(UIUC)伊利诺伊香槟分校
Carnegie Mellon(卡梅基隆)
Mit[麻省理工学院]
Princeton[普灵斯顿大学]
purdue[普度大学]
Stanford[斯坦福大学]
中国科学技术大学
交通大学
北京大学
南京大学
复旦大学
浙江大学
清华大学
12应用数学,建模
Math.com
中国数学建模
中国统计网
数学中国
数学常用工具FAQ
13ComputerScience
《计算机教育》期刊网站
acm来了
李开复学生网
15综合科学
《科学》杂志
从欧氏几何到微分几何
16数值计算
Pi的小站
17朋友的链接
Nemon
大漠穷秋
18EnglishLearning
沪江英语
20图形学
The Chaos Games
VRML用户手册
中国虚拟现实开发者
中国计算机图形学教学研究会
分形屏道
分形艺术
机器视觉在线
虚拟无忌
21操作系统
Bochs摸拟环境
ChinaLinux
Linux/BSD/UNIX文档
Linux_Kernel
中国UNIX技术联盟
帮助Linux爱好者
永远的UNIX
22ActionScript_Flash
[Flasher]Dengjie
[开源的AS2编译器]Mtasc
FlashASM
RobertPenner
ultrashock
X-Woods
闪吧音乐盒
23C/C++
C++ Home
C++FAQ-LITE
C-C++ User Journal
CPlusPlus.com
C语言之家
GCC Compiler
GCC.GNU
SGI-STL
VCHelp[CN DEV]
VC知识库
24GameDev
CSDN游戏开发站
GamaSutra
GameAI
GameDev.NET
Gamerers
vbgamer
25JAVA技术
JAVA.SUN
中文JAVA技术网
26编程技术
[MSDN Eng]
[MSDN 中文版]
ASCII Table
SourceForge
UML.ORG
中国程序员(CSDN)
文件格式汇编
程序员联合开发网
问专家
28物理模拟与仿真
中国仿真互动
流体中文网
29网络安全
绿盟论坛
30环保
中国环境监测
南水北调网
国家环保总局
江苏环保网
31可爱的事物
叮铛论坛
32设计,排版
5D多媒体
BlueIdea
印科网
33影视,音乐,电台
上海文广新闻传媒
阿拉上海人
34优秀个人BLOG
fisher_jiang的专栏
gzfqh的专栏
ScienceStudy
刘爱贵的个人主页
大肚能容天下剑
寒蝉退士
梦想风暴
煮石
男儿当自强
男单618
编程夜未眠
记得忘记@博客
35专栏
抗战胜利60年(sina)
抗战胜利60年(yahoo)
50电子游戏
Raine街机模拟器
WAR3中文网
专业射击游戏联盟
地精研究院
51常用软件
flashfxp
GreenBrowser
小巧好用的编辑器SciTEFlash
强力抓屏
金山在线词典
52网上书店
DearBook
当当网
53硬件DIY
52硬件
电脑报论坛
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 随机数产生原理及应用收藏

新一篇: 一周精品网页回顾(0604015----060422) | 旧一篇: EmilMatthew BLOG文档索引 ------06年1月至3月(人文,随笔,活动类)

随机数产生原理及应用

EmilMatthew(EmilMatthew@126.com)     

摘要: 

       本文简述了随机数的产生原理,并用C语言实现了迭代取中法,乘同余法等随机数产生方法,同时,还给出了在符合某种概率分布的随机变量的产生方法。

 

关键词: 伪随机数产生,概率分布

      

1前言:

       在用计算机编制程序时,经常需要用到随机数,尤其在仿真等领域,更对随机数的产生提出了较高的要求,仅仅使用C语言类库中的随机函数已难以胜任相应的工作。本文简单的介绍随机数产生的原理及符合某种分布下的随机变量的产生,并用C语言加以了实现。当然,在这里用计算机基于数学原理生成的随机数都是伪随机数。

       :这里生成的随机数所处的分布为0-1区间上的均匀分布。我们需要的随机数序列应具有非退化性,周期长,相关系数小等优点。

 

2.1迭代取中法:   

这里在迭代取中法中介绍平方取中法,其迭代式如下:

                     Xn+1=(Xn^2/10^s)(mod 10^2s)

                     Rn+1=Xn+1/10^2s

       其中,Xn+1是迭代算子,而Rn+1则是每次需要产生的随机数  

第一个式子表示的是将Xn平方后右移s位,并截右端的2s位。

而第二个式子则是将截尾后的数字再压缩2s倍,显然:0=<Rn+1<=1.

这样的式子的构造需要深厚的数学(代数,统计学,信息学)功底,这里只是拿来用一下而已,就让我们站在大师的肩膀上前行吧。

       迭代取中法有一个不良的性就是它比较容易退化成0.

平方取中法的实现:

#include <stdio.h>

#include <math.h>

 

#define S 2

 

float Xn=12345;//Seed & Iter

float Rn;//Return Val

 

void InitSeed(float inX0)

{

       Xn=inX0;

}

 

/*

       Xn+1=(Xn^2/10^s)(mod 10^2s)

       Rn+1=Xn+1/10^2s

*/

 

float MyRnd()

{

              Xn=(int)fmod((Xn*Xn/pow(10,S)),pow(10,2*S));//here can's use %

              Rn=Xn/pow(10,2*S);

              return Rn;

}

 

/*测试主程序,注意,这里只列举一次测试主程序,以下不再重复*/

int main()

{

              int i;

              FILE * debugFile;

             

              if((debugFile=fopen("outputData.txt","w"))==NULL)

                {

            fprintf(stderr,"open file error!");

            return -1;

          }   

             

        printf("\n");

              for(i=0;i<100;i++)

              {

               tempRnd=MyRnd();

fprintf(stdout,"%f ",tempRnd);

                     fprintf(debugFile,"%f ",tempRnd);

              }                  

              getchar();

             

              return 0;

}

 

前一百个测试生成的随机数序列:

0.399000 0.920100 0.658400 0.349000 0.180100 0.243600 0.934000 0.235600 0.550700 0.327000 0.692900 0.011000 0.012100 0.014600 0.021300 0.045300 0.205200 0.210700 0.439400 0.307200 0.437100 0.105600 0.115100 0.324800 0.549500 0.195000 0.802500 0.400600 0.048000 0.230400 0.308400 0.511000 0.112100 0.256600 0.584300 0.140600 0.976800 0.413800 0.123000 0.512900 0.306600 0.400300 0.024000 0.057600 0.331700 0.002400 0.000500 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

                    

容易看出其易退化成0的缺点.

      

       2.2乘同余法:

       乘同余法的迭代式如下:

Xn+1=Lamda*Xn(mod M)

       Rn+1=Xn/M

       各参数意义及各步的作用可参2.1

       当然,这里的参数的选取是有一定的理论基础的,否则所产生的随机数的周期将较小,相关性会较大。

       经过前人检验的两组性能较好的素数取模乘同余法迭代式的系数为:

1)  lamda=5^5,M=2^35-31

2)  lamda=7^5,M=2^31-1

 

相应C程序关键代码段:

double long  M;//请注意,这里一定要用到double long,否则计算2^32会溢出

 

float MyRnd()

{

              Xn=fmod(Lamda*Xn,M);//here can's use %

              Rn=Xn/M;

              return Rn;

}

 

初始化段,应有:

M=pow(2,35)-31;

                          图1:  乘同余法生成的300随机数的产生序列图

                              

                          2: 乘同余法生成的300随机数的分布情况

可以看到,该随机数生成方法所生成的随机序列比较符合0-1上的均匀分布,不过在某些数据段还有些起伏。

 

2.3混合同余法:

       混合同余法是加同余法和乘同余法的混合形式,其迭代式如下:

       Xn+1=(Lamda*Xn+Miu)%M

       Rn+1=Xn/M

       经前人研究表明,在M=2^q的条件下,参数lamda,miu,X0按如下选取,周期较大,概率统计特性好:

       Lamda=2^c+1,cq/2附近的数

       Miu=(1/2+sqrt(3))/M

       X0为任意非负整数

      

相应C程序关键代码段:

       //init proper argu number

       M=pow(2,32);

       Lamda=pow(2,16)+1;

       Miu=(0.5+sqrt(3)/6)/M;

             

       float MyRnd()

{

              Xn=fmod(Lamda*Xn+Miu,M);

              Rn=Xn/M;

              return Rn;

}

               

                            3: 乘同余法生成的300随机数的产生序列图

             

                     4: 乘同余法生成的300随机数的分布情况

       由图4可以看出,该种随机数生成方法已相当接近0-1上的均匀分布。但在图3中可以看出它的一个致命的弱点,那就是随机数的生成在某一周期内成线性增长的趋势,显然,在大多数场合,这种极富“规律”型的随机数是不应当使用的。

 

下面的概率分布型随机变量的生成,均采用乘同余法或C函数库中的随机数来生成0-1区间上的随机数。

下面将C语言中的随机数生成序列图和Matlab中的随机数生成序列图列于下面,以作对比之用:

      

                                   C语言生成的300个随机数的序列图

       

Matlabrand函数生成的300个随机数的序列图

可以看出:乘同余法生成的随机数序列的随机性与上述两个标准库函数相接近。

 

 

       3连续型随机变量的生成:

       3.1反函数法

       采用概率积分变换原理,对于随机变量X的分布函数F(X)可以求其反函数,得:

Xi=G(Ri)

其中,Ri为一个0-1区间内的均匀分布的随机变量.

F(X)较简单时,求解较易,当F(X)较复杂时,需要用到较为复杂的变换技巧。

 

3.1.1平均分布:

:已知炮弹对目标的方位角Fi0-2*P内均匀分布,试用(01)均匀随机数变换,模拟弹着点方位角的抽样值Fi.

:   R=F(Fi)=Fi/2*PI

       Fi=G(R)=2*PI*R      ,其中,R0-1区间上的均匀分布的随机数.

 

程序略

                                       

试验结果:

         

                            5:用反函数法生成的300随机数的平均分布情况

由于这里相当对0-1上的分布进行线性变换,所以变换后仍呈均匀分布是显然的。

 

3.1.2指数分布:

指数分布的分布函数为:

x<0,F(x)=0       ; x>=0,F(x)=1-exp(-lamda*x)

利用反函数法,可以求得:   x=-lnR/lamda

 

试验结果:

              

6:用反函数法生成的300随机数的指数分布情况

 

可以看出,生成的随机量较好的符合了指数分布特征。

 

3.2正态分布随机变量的生成:

正态分布在概率统计的理论及应用中占有重要地位,因此,能产生符合正态分布的随机变量就在模拟一类的工作中占有相当重要的地位。下面介绍两种方法。

3.2.1舍选法: