乘线性同余随机数发生器法产生随机数

genLCG 乘同余法产生随机数,模特卡罗方法,matlab
238万源代码下载-
&文件名称: genLCG
& & & & &&]
&&所属分类:
&&开发工具: matlab
&&文件大小: 1 KB
&&上传时间:
&&下载次数: 3
&&提 供 者:
&详细说明:乘同余法产生随机数,模特卡罗方法,matlab-By congruential method for generating random numbers, model Carlo method
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&genLCG.m
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 这是一个产生随机数的函数,功能相当齐全,不相信可以试试看哈
&[] - 单击“产生随机数”按钮,产生30个随机数,要求:(1)每隔100毫秒产生1个随机数,(2)用进度条控件显示随机数产生的进度,(3)将这些数以字符串的形式添加到组合框中,(4)实现组合框中内容的选择、删除功能。用乘同余法产生随机数 - Read 内容详尽,但请以实际操作为准,欢迎下载使用
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
用乘同余法产生随机数 - Read
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
用乘同余法产生随机数
下载积分:400
内容提示:用乘同余法产生随机数
文档格式:PDF|
浏览次数:175|
上传日期: 08:07:45|
文档星级:
该用户还上传了这些文档
用乘同余法产生随机数
官方公共微信用线性同余生成器编写随机数生成器
[问题点数:50分,结帖人bpl199015]
用线性同余生成器编写随机数生成器
[问题点数:50分,结帖人bpl199015]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
2006年4月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。纯线性同余随机数生成器 - Fangzhen - 博客园
随笔 - 367, 文章 - 174, 评论 - 83, 引用 - 0
线性同余随机数生成器介绍:
古老的LCG(linear&congruential&generator)代表了最好最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。&
LCG 算法数学上基于公式:
X(n+1)&=&(a&*&X(n)&+&c)&%&m
其中,各系数为:
模m,&m&&&0系数a,&0&&&a&&&m增量c,&0&&=&c&&&m原始值(种子)&0&&=&X(0)&&&m其中参数c,&m,&a比较敏感,或者说直接影响了伪随机数产生的质量。一般而言,高LCG的m是2的指数次幂(一般2^32或者2^64),因为这样取模操作截断最右的32或64位就可以了。多数编译器的库中使用了该理论实现其伪随机数发生器rand()。
下面是部分编译器使用的各个参数值:
Sourcemacrand() / Random(L)的种子位Numerical Recipes2^321664525&Borland C/C++2^321位30..16 in rand(), 30..0 in lrand()glibc (used by GCC)2^3212345位30..0ANSI C: Watcom, Digital Mars, CodeWarrior, IBM VisualAge C/C++2^32
位30..16Borland Delphi, Virtual Pascal2^321
位63..32 of (seed * L)Microsoft Visual/Quick C/C++
2^322140132531011位30..16
Apple CarbonLib
2^31-116807
见Park–Miller随机数发生器LCG不能用于随机数要求高的场合,例如不能用于Monte&Carlo模拟,不能用于加密应用。LCG有一些严重的缺陷,例如如果LCG用做N维空间的点坐标,这些点最多位于m1/n超平面上(Marsaglia定理),这是由于产生的相继X(n)值的关联所致。另外一个问题就是如果m设置为2的指数,产生的低位序列周期远远小于整体。一般而言,输出序列的基数b中最低n位,bk&=&m&(k是某个整数),最大周期bn.有些场合LCG有很好的应用,例如内存很紧张的嵌入式中,电子游戏控制台用的小整数,使用高位可以胜任。
(2) C语言中伪随机数生成方法:rand(),srand(time(null))的解析
C语言中伪随机数生成算法实际上是采用了"线性同余法"。具体的计算如下:
Xi = (Xi-1 * A + C ) mod M
其中A,C,M都是常数(一般会取质数)。当C=0时,叫做乘同余法。引出一个概念叫seed,它会被作为X0被代入上式中,然后每次调用rand()函数都会用上一次产生的随机值来生成新的随机值。可以看出实际上用rand()函数生成的是一个递推的序列,一切值都来源于最初的 seed。所以当初始的seed取一样的时候,得到的序列都相同。
C语言里面有RAND_MAX这样一个宏,定义了rand()所能得到的随机值的范围。在C里可以看到RAND_MAX被定义成0x7fff,也就是32767。rand()函数里递推式中M的值就是32767。
线性同余法生成的是伪随机数,粗略符合均匀分布。根据中心极限定理,任何分布的噪声,通过反复相加,就可以成为高斯噪声。
1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。
3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
// C++随机函数(VC program)
#include &stdio.h&
#include &iostream&
#include &time.h&
#define MAX 100
int main(int argc, char* argv[])
srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面 不然要很长时间等待
for (int i=0;i&10;i++)
cout&&rand()%MAX&&//MAX为最大值,其随机域为0~MAX-1
rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。这样,如果你要产生0~10的10个整数,可以表达为:
int N = rand() % 11;
这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:
int N = 1 + rand() % 11;
总结来说,可以表示为:
a + rand() % n
其中的a是起始值,n是整数的范围。
a + rand() % (b-a+1) 就表示a~b之间的一个随机数
若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依此类推。
通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。
如大家所说,还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。

我要回帖

更多关于 乘同余法原理 的文章

 

随机推荐