导航:首页 > 源码编译 > 模拟随机数的在线算法

模拟随机数的在线算法

发布时间:2022-05-13 23:51:59

‘壹’ 随机数生成方案(计算方法)

诺依曼的平方数取中法。
先通过求关键码的平方值,从而扩大相近数的差别,然后根据表长度取中间的几位数(往往取二进制的比特位)

‘贰’ 随机数和伪随机数的计算公式都是什么呀

为追求真正的随机序列,人们曾采用很多种原始的物理方法用于生成一定范围内满足精度(位数)的均匀分布序列,其缺点在于:速度慢、效率低、需占用大量存储空间且不可重现等。为满足计算机模拟研究的需求,人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机数是指用数学递推公式所产生的随机数。从实用的角度看,获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。典型情况下,它会输出一个均匀分布在0和1区间内的伪随机变量的值。其中应用的最为广泛、研究最彻底的一个算法即线性同余法。

线性同余法LCG(Linear Congruence Generator)

选取足够大的正整数M和任意自然数n0,a,b,由递推公式:

ni+1=(af(ni)+b)mod M i=0,1,…,M-1

生成的数值序列称为是同余序列。当函数f(n)为线性函数时,即得到线性同余序列:

ni+1=(a*ni+b)mod M i=0,1,…,M-1

以下是线性同余法生成伪随机数的伪代码:

Random(n,m,seed,a,b)
{
r0 = seed;
for (i = 1;i<=n;i++)
ri = (a*ri-1 + b) mod m
}

其中种子参数seed可以任意选择,常常将它设为计算机当前的日期或者时间;m是一个较大数,可以把它取为2w,w是计算机的字长;a可以是0.01w和0.99w之间的任何整数。

应用递推公式产生均匀分布随机数时,式中参数n0,a,b,M的选取十分重要。

例如,选取M=10,a=b =n0=7,生成的随机序列为{6,9,0,7,6,9,……},周期为4。

取M=16,a=5,b =3,n0=7,生成的随机序列为{6,1,8,11,10,5,12,15,14,9,0,3,2,13,4,7,6,1……},周期为16。

取M=8,a=5,b =1,n0=1,生成的随机序列为{6,7,4,5,2,3,0,1,6,7……},周期为8。

Visual C++中伪随机数生成机制

用VC产生随机数有两个函数,分别为rand(void)和srand(seed)。rand()产生的随机整数是在0~RAND_MAX之间平均分布的,RAND_MAX是一个常量(定义为:#define RAND_MAX 0x7fff)。它是short型数据的最大值,如果要产生一个浮点型的随机数,可以将rand()/1000.0,这样就得到一个0~32.767之间平均分布的随机浮点数。如果要使得范围大一点,那么可以通过产生几个随机数的线性组合来实现任意范围内的平均分布的随机数。

其用法是先调用srand函数,如

srand( (unsigned)time( NULL ) )

这样可以使得每次产生的随机数序列不同。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。也可以使用srand函数来人为指定种子数分析以下两个程序段,

程序段1:

//包含头文件
void main() {
int count=0;
for (int i=0;i<10;i++){
srand((unsigned)time(NULL));
count++;
cout<<"No"<
//包含头文件
void main() {
int count=0;
srand((unsigned)time(NULL));
for (int i=0;i<10;i++){
count++;
cout<<"No"<
No1=9694 No2=9694 No3=9694 No4=9694 No5=9694
No6=9694 No7=9694 No8=9694 No9=9694 No10=9694

程序段2的运行结果为:

No1=10351 No2=444 No3=11351 No4=3074 No5=21497
No6=30426 No7=6246 No8=24614 No9=22089 No10=21498

可以发现,以上两个程序段由于随机数生成时选择的种子的不同,运行的结果也不一样。rand()函数返回随机数序列中的下一个数(实际上是一个伪随机数序列,序列中的每一个数是由对其前面的数字进行复杂变换得到的)。为了模仿真正的随机性,首先要调用srand()函数给序列设置一个种子。为了更好地满足随机性,使用了时间函数time(),以便取到一个随时间变化的值,使每次运行rand()函数时从srand()函数所得到的种子值不相同。伪随机数生成器将作为"种子"的数当作初始整数传给函数。这粒种子会使这个球(生成伪随机数)一直滚下去。

程序段1中由于将srand()函数放在循环体内,而程序执行的CPU时间较快,调用time函数获取的时间精度却较低(55ms),这样循环体内每次产生随机数用到的种子数都是一样的,因此产生的随机数也是一样的。而程序段2中第1次产生的随机数要用到随机种子,以后的每次产生随机数都是利用递推关系得到的。 基于MFC的随机校验码生成

Web应用程序中经常要利用到随机校验码,校验码的主要作用是防止黑客利用工具软件在线破译用户登录密码,校验码、用户名、密码三者配合组成了进入Web应用系统的钥匙。在利用VC开发的基于客户机/浏览器(Client/Server)模式的应用软件系统中,为了防止非法用户入侵系统,通常也要运用随机校验码生成技术。

‘叁’ 求随机数常用算法

一般随机数都不是完全随机的,你在一个程序里两次调用系统的随机函数,你会发现是一样的!
给你个思路,用系统函数得到当前进程的开始时间,然后处理这个时间,算法想怎么写就怎么写,因为每次程序运行时间的不一样的,所以得到的随机数就“随机”了,很多随机函数都是这么做的!

‘肆’ 随机模拟方法

2.2.1 随机模拟的直接算法

对随机问题(带有场域随机性或时域随机性)分析的直接模拟方法的基本步骤是:

(1)建立描述和刻画系统行为功能的确定性分析模型,并确定其求解方法。

(2)分析和确认基本的随机变量(随机场)及其分布函数。采用蒙特卡罗方法产生随机数(随机样本)。

(3)根据所产生的随机样本,按确定性分析方法求解所模拟问题的输出量(系统反应)。

(4)计算分析系统反应量的样本反应估计值,如样本反应均值,样本反应方差及样本反应谱密度估计等。

2.2.2 Neumann展开算法

对许多工程问题的分析计算最终都归结为计算求解下列形式的线性方程组:

地下水系统随机模拟与管理

式中:K——受随机变量影响的系统结构整体刚度矩阵;

F——由边界和系统外部条件确定的列向量;

H——系统状态反应列向量。

由于矩阵K一般具有对称正定性,所以可用Cholesky分解法求解上述方程,即取:

地下水系统随机模拟与管理

而H可由下列两步求解过程给出:

地下水系统随机模拟与管理

在随机模拟的直接算法中,每产生一次随机样本结构,就要进行一次(2.14)式的分解运算,而为了获得更加精确的随机样本的统计量,必然会有大量的随机样本产生,所以其计算工作量非常之大,而利用Neumann展开思想,可以在全部模拟计算过程中只进行Cholwsky分解,从而使计算工作量大大降低。为此设:

地下水系统随机模拟与管理

式中:K0——均值参数结构所对应的系统整体结构矩阵;

ΔK——样本结构关于均值参数结构的偏差部分。

显然:

地下水系统随机模拟与管理

由式(2.13)及式(2.17)有:

令:

地下水系统随机模拟与管理

则由Neuman展开公式有:

地下水系统随机模拟与管理

将式(2.21)代入式(2.19)有:

地下水系统随机模拟与管理

显然可得下列递推公式:

地下水系统随机模拟与管理

将式(2.20)代入式(2.23)并稍作变换即有:

地下水系统随机模拟与管理

于是,一旦由K0 H0=F(2.25)

求出H0,即可用递推公式依此求得H1,H2,…,Hn。代入(2.22)便得样本反应量H。

原则上,Neumann展开算法只是随机模拟算法实施过程中为节省运算工作量而采取的一项技术措施,而对于随机模拟的思想则未做任何改进。

2.2.3 摄动算法

对于确定性物理问题的控制方程可以表示为带有小参数的方程。

地下水系统随机模拟与管理

式中:L——一般的线性算子;

H——所研究物理问题的解,H一般可表示为H=H(X,ε);

X——控制自变量;

ε——小参数。

一般地说,方程(2.26)所描述的问题往往不能精确地解出,但根据H为X和ε的函数且ε是小参数的特点,可以用ε的一个渐近展开式来表示H,即:

地下水系统随机模拟与管理

式中Hi(x)与ε无关。

将式(2.27)代入式(2.26),并将ε的同次幂系数合并起来可得:

地下水系统随机模拟与管理

式中:L0,L1,L2,…——空间H中的线性算子;

h——关于x的实函数,可根据具体情况给出它们的形式。

由于方程(2.28)对所有的ε都必须成立,又因为ε的序列是线性无关的,故ε各次幂前面的系数项必须自动为零,即有:

地下水系统随机模拟与管理

式(2.29)构成了关于Hi(x)的递推方程组。

根据边初值条件可依次求得序列H0,H1,H2,…从而代入式(2.27)可得H(x,ε)的近似解。

将上述关于确定性物理问题的摄动求解思想推广到带有随机参数的问题中来,就构成了随机参数摄动问题,为此,设所考虑问题的随机微分算子方程为:

地下水系统随机模拟与管理

式中:L——算子符号;

x——自变量;

ξ——某一给定分布的随机变量;

Y——一随机函数,可表示为Y=Y(x,ξ)。

随机变量 可转化为用标准随机变量表示的形式:

地下水系统随机模拟与管理

式中:ξ0——随机变量ξ的均值;

ξr——随机变量ξ的均方差;

b——均值为零,方差为1的标准化随机变量。

将式(2.31)代入式(2.30)有:

地下水系统随机模拟与管理

利用随机函数的幂级数展开式可将解Y(x,ξ)展开为关于随机变量b的级数:

地下水系统随机模拟与管理

由于-b=0,故上式可表示为:

地下水系统随机模拟与管理

由于 y 未知,所以系数式等也是未知的,但可将上式等价地写为:

地下水系统随机模拟与管理

显然,上式中的系数Ui(x)与b无关,为一确定性函数。

将式(2.34)代入式(2.32)并经适当的运算后将b的不同次幂系数项合并起来,可得:

地下水系统随机模拟与管理

式中:L0,L1,L2,…,Ln——确定性算子;

h——关于x的实函数。

由于随机变量b具有任意性,因此,式(2.35)成立的充分条件是各系数项皆为零,由此可得:

地下水系统随机模拟与管理

上述方程组为一组确定性算子方程,当给定边界条件和初值条件以后,便可依次求出解U0,U1,U2,…回代方程(2.13)后即可得到y(x,ξ)的形式解答,而解答的均值与方差分别为:

地下水系统随机模拟与管理

‘伍’ 有哪些随机数算法呢

1、数值概率算法:用于数值问题的求解。所得到的解几乎都是近似解,近似解的精度
随着计算时间的增加而不断地提高。
2、拉斯维加斯算法(LasVegas):要么给出问题的正确答案,要么得不到答案。反复求解多次,可
使失效的概率任意小。
3、蒙特卡罗算法(MonteCarlo):总能得到问题的答案,偶然产生不正确的答案。重复运行,每一次
都进行随机选择,可使不正确答案的概率变得任意小。
4、舍伍德算法(Sherwood):很多具有很好的平均运行时间的确定性算法,在最坏的情况下性能很
坏。引入随机性加以改造,可以消除或减少一般情况和最坏情况的差别。

‘陆’ 深度学习用于预测非线性随机数的算法有哪些求算法,谢谢!

摘要 #8生成对抗网络(GAN)

‘柒’ 随机数算法是什么

在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器。有关如何产生随机数的理论有许多如果要详细地讨论,需要厚厚的一本书的篇幅。不管用什么方法实现随机数发生器,都必须给它提供一个名为“种子”的初始值。而且这个值最好是随机的,或者至少这个值是伪随机的。“种子”的值通常是用快速计数寄存器或移位寄存器来生成的。下面讲一讲在C语言里所提供的随机数发生器的用法。现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:”)首先给srand()提供一个种子,它是一个unsignedint类型,其取值范围从0~65535;2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)3)根据需要多次调用rand(),从而不间断地得到新的随机数;4)无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。这个过程看起来很简单,问题是如果你每次调用srand()时都提供相同的种子值,那么,你将会得到相同的随机数序列,这时看到的现象是没有随机数,而每一次的数都是一样的了。例如,在以17为种子值调用srand()之后,在首次调用rand()时,得到随机数94。在第二次和第三次调用rand()时将分别得到26602和30017,这些数看上去是很随机的(尽管这只是一个很小的数据点集合),但是,在你再次以17为种子值调用srand()后,在对于rand()的前三次调用中,所得的返回值仍然是在对94,26602,30017,并且此后得到的返回值仍然是在对rand()的第一批调用中所得到的其余的返回值。因此只有再次给srand()提供一个随机的种子值,才能再次得到一个随机数。下面的例子用一种简单而有效的方法来产生一个相当随机的“种子”值----当天的时间值:g#椋睿悖欤酰洌澹Γ欤簦唬螅簦洌椋铮瑁Γ纾簦弧。#椋睿悖欤酰洌澹Γ欤簦唬螅簦洌欤椋猓瑁Γ纾簦弧。#椋睿悖欤酰洌澹Γ欤簦唬螅螅Γ#矗罚唬簦穑澹螅瑁Γ纾簦弧。#椋睿悖欤酰洌澹Γ欤簦唬螅螅Γ#矗罚唬簦椋恚澹猓瑁Γ纾簦弧。觯铮椋洹。恚幔椋睿ǎ觯铮椋洌。。椋睿簟。椋弧。酰睿螅椋纾睿澹洹。椋睿簟。螅澹澹洌郑幔欤弧。螅簦颍酰悖簟。簦椋恚澹狻。簦椋恚澹拢酰妫弧。妫簦椋恚澹ǎΓ幔恚穑唬簦椋恚澹拢酰妫弧。螅澹澹洌郑幔欤剑ǎǎǎǎ酰睿螅椋纾睿澹洹。椋睿簦簦椋恚澹拢酰妫簦椋恚澹Γ幔恚穑唬埃疲疲疲疲。ǎ酰睿螅椋纾睿澹洹。椋睿簦簦椋恚澹拢酰妫恚椋欤欤椋簦恚蕖。ǎ酰睿螅椋纾睿澹洹。椋睿簦簦椋恚澹拢酰妫恚椋欤欤椋簦恚弧。螅颍幔睿洌ǎǎ酰睿螅椋纾睿澹洹。椋睿簦螅澹澹洌郑幔欤弧。妫铮颍ǎ椋剑埃唬椋Γ欤簦唬保埃唬椋。穑颍椋睿簦妫ǎΓ瘢酰铮簦唬ィ叮洌Γ#梗玻唬睿Γ瘢酰铮簦籦egjrand());}上面的程序先是调用_ftime()来检查当前时间yc并把它的值存入结构成员timeBuf.time中wae当前时间的值从1970年1月1日开始以秒计算aeh在调用了_ftime()之后在结构timeBuf的成员millitm中还存入了当前那一秒已经度过的毫秒数,但在DOS中这个数字实际上是以百分之一秒来计算的。然后,把毫秒数和秒数相加,再和毫秒数进行异或运算。当然也可以对这两个结构成员进行更多的计算,以控制se......余下全文>>

阅读全文

与模拟随机数的在线算法相关的资料

热点内容
ubuntu压缩zip 浏览:2
vigenere算法的方法是什么 浏览:666
pdf保护破解 浏览:341
仿微信聊天系统源码广州公司 浏览:106
怎么查看我的世界服务器日志 浏览:430
怎么从程序员走到成功 浏览:824
把软件放入文件夹中如何移出 浏览:209
红包源码企业即时聊天软件 浏览:581
xp安装python 浏览:10
西门子参数编程读取半径值 浏览:403
洗首饰解压小视频 浏览:966
01背包问题的算法解决 浏览:373
sd卡放哪个文件夹 浏览:301
解释器模式java 浏览:104
android垂直自动滚动条 浏览:153
计算器java小程序 浏览:27
java的简称 浏览:68
云服务器公网ip地址 浏览:581
php对数据库操作 浏览:237
java爬图片 浏览:868