fortran产生随机数方法介绍

更新时间:2023-10-17 08:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

fortran产生随机数方法介绍(附代码)

注意:现在计算机产生的随机数都是伪随机数。 1.0-1之间均匀分布的随机数

random_number(x) 产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。

用了random_seed ()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。 program random implicit none real :: x

call random_seed () ! 系统根据日期和时间随机地提供种子 call random_number (x) ! 每次的随机数就都不一样了 write(*,*) x stop

end program random 2.产生1-100的随机整数

subroutine my_random(abound,ubound) integer::abound,ubound,len,random

real::t

len=ubound-abound

call random_number(t)

random=abound+floor(t*(len+1))

return end subroutine

2.任意区间均匀分布的随机数

function my_random (lbound,ubound) implicit none

real :: lbound,ubound real :: len

real :: my_random real :: t

len=ubound-lbound !计算范围大小

call random_number(t) !t是0-1之间的随机数 my_random=lbound+len*t return end

注意:在循环外call random_seed()

3.产生一个随机数数组,只需加一个循环即可 function my_random (lbound,ubound) implicit none

real :: lbound,ubound real :: len integer size

real :: my_random(size) !size代表数组元素的个数 real :: t integer i

len=ubound-lbound !计算范围大小 do i=1,10

call random_number(t) !t是0-1之间的随机数

my_random(i)=lbound+len*t !把t转换成lbound-ubound间的随机数 end do

return end

注意:同理在循环外call random_seed() 4.标准正态分布随机数/高斯分布随机数

(1)徐士良的那本程序集里介绍了正态分布随机数产生的原理,不过他的方法只能产生较为简

单的随机数,随机数的质量并不高,特别是随机数的数目较多时。

(2)Box 和 Muller 在 1958 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法。

设 U1, U2 是区间 (0, 1) 上均匀分布的随机变量,且相互独立。令 X1 = sqrt(-2*log(U1)) * cos(2*PI*U2); X2 = sqrt(-2*log(U1)) * sin(2*PI*U2);

那么 X1, X2 服从 N(0,1) 分布,且相互独立。等于说我们用两个独立的 U(0,1) 随机数得到了

两个独立的 N(0,1)随机数。

值得说明的是,该方法产生的随机数质量很高。嘻嘻,本人亲自验证过。

SAS和蒙特卡罗模拟_随机数

一、为什么选择SAS做蒙特卡罗模拟?

为什么要用SAS做蒙卡?首先,对我来说,我只会用SAS,而且打算用SAS完成我所有的工作。当然,其他一些通用的理由有(Fan, etc.,2002):

1. 蒙卡是个计算密集的活,而SAS Base、SAS Macro、SAS/IML强大而灵活的编程能力能满足这一要求;

2. 做蒙卡时要用到大量的统计/数学技术,而SAS就内置了大量的统计/数学函数(在 SAS/Stat和SAS/ETS);用Fortran或C++当然也是非常好的主意,只是他们缺少内置的统计函数,代码就要冗长复杂很多。 二、什么是蒙卡?一个启发性例子

好,开始,什么是蒙卡?了解它背景知识的最好办法当然是

wiki-Monte_Carlo_method。蒙特卡罗是位于摩洛哥的一家赌场,二战时,美国Los Alamos国家实验室把它作为核裂变计算机模拟的代码名称。作为模拟方法,蒙卡以前就叫统计抽样(statistical sampling),我们感兴趣的结果因为输入变量的不确定而不可知,但如果能依概率产生输入变量的样本,我们就可以估计到结果变量的分布。跟蒙卡对应的,还有一种模拟技术叫系统模拟,包括排队、库存等模型,这些模型都跟随时间推移而出现的事件序列有关。下面举个蒙卡的例子,来自Evans, etc.( 2001)的超级简化版。

假设一家企业,利润是其需求量的函数,需求是随机变量。为了简化讨论,假定利润就是需求的两倍。这里输入变量就是不可控的需求,结果变量就是我们感兴趣的利润。假设需求以相同的概率取10、20、30、40、50、60这六种情况。在这样的简化下,我们就可以投一枚均匀的骰子来产生需求的样本,如果点数为1,对应得需求就是10,点数为2,需求就是20,以下类推。这样,我们的模拟过程就是:

1. 投骰子;

2. 根据骰子的点数确定需求量; 3. 根据需求量,求利润。

掷10次骰子,假设我们的模拟结果如下: 重复次数 1 2 3 4 5 6 7 8 9 10

骰子点数 5 3 3 6 1 3 4 5 2 5

需求量 50 30 30 60 10 30 40 50 20 50

利润 100 60 60 120 20 60 40 100 20 50

这样通过模拟需求的样本,我们对结果利润的分布也就有所知晓,比如平均利润可以算出就是63。蒙卡一个重要的步骤就是生成随机数,这里我们是用投骰子来完成。

三、又一个例子:利用蒙特卡罗模拟方法求圆周率∏(pi) 再举个很有名的例子,就是估计圆周率∏的值,来自Ross(2006)。这个试验的思路正好可以帮我们温习一下几何概型的概念。我们知道概率的古典概型,就是把求概率的问题转化为计数:样本空间由n个样本点组成,事件A由k个样本点组成,则事件A的概率就是k/n。考虑到概率和面积在测度上具有某种共性,几何概型的基本想法是把事件跟几何区域相对应,用面积来计算概率,其要点是:

1. 认为样本空间Ω是平面上的某个区域,其面积记为υ(Ω); 2. 向区域Ω随机投掷一点,该点落入Ω内任何部分区域内的

可能性只与这部分区域的面积成比例,而与这部分区域的位置和形状无关;

3. 设事件A是Ω的某个区域,面积为υ(A),则向区域Ω上随机投掷一点,该点落在区域A的可能性称为事件A的概率,P(A)=υ(A)/υ(Ω)。

扯远了,回到用蒙卡估计圆周率∏的实验思路。假设样本空间是一个边长为2

面积为4的正方形,我们感兴趣的事件是正方形内的一个半径为1面积为∏的圆,所以向正方形内随机投掷一点,落在圆里面的概率为∏/4。实验的思路如下:

1. 1)生成随机数——生成n个均匀落在正方形内的点;

2. 2)对落在正方形内的n个点,数一数正好落在圆里面的点的个数,假设为k(另外n-k个点就落在圆外面的正方形区域内)。 3. 3)k/n就可以大致认为是圆的面积与正方形的面积之比,另其等于∏/4,就可以求出圆周率∏的估计值。

又,Forcode提供了利用电子表格Excel求解以上问题的详细过程,有兴趣可以看看。另外,这里也有一个详细的说明,用Mathematica实现。

四、随机数很重要(以及下期预告)

在第一个例子中,我强调了骰子要是均匀的。那里骰子就是我们的随机数生成器,骰子的均匀程度就是我们随机数的“随机”成分。在上面的10次试验中,投出了3次点数“3”和3次点数“5”,然后点数“1”、“2”、“4”、“6”各出现一次——因为只是重复了10次,这样我们对骰子的均匀程度不好评估,但如果重复无数次——假如是十万次,如果还出现类似比例的结果,那么就有理由怀疑这粒骰子的均匀程度了。如果骰子灌了铅,比如投出点数“6”的可能性从六分之一上升到6分之三,那么根据这粒骰子来做模拟,我们就有高估需求以及利润的危险。

下次就讲讲随机数的生成原理,当然结合SAS来讲,或者也会提一下Excel。 五、其他软件包

在商业领域,基于Excel的插件比较兴盛,比如Crystal Ball应用就较为普遍,有试用版可以下载。其他竞争产品有@Risk、Risk Solver等。现在据说Risk Simulator也开始兴盛起来,大有后来居上之势。他的开发者Johnathan Mun还在Wiley Finance系列有一本书,Modeling Risk: Applying Monte Carlo Simulation, Real Options Analysis, Forecasting, and Optimization Techniques。

S语言(R或者S-Plus)由于其面对对象的特性,加之丰富的内置函数和诸多用户提供的库,使得R或者S-Plus也是蒙卡研究的得力工具——或者比SAS更有前景。这个我不熟,略之。

Random Numbers

最简单、最基本、最重要的随机变量是在[0,1]上均匀分布的随机变量。一般地,我们把[0,1]上均匀分布随机变量的抽样值称为随机数,其他分布随机变量的抽样都是借助于随机数来实现的。以下谈的都是所谓“伪随机数”(Pseudo Random Numbers)。产生随机数,可以通过物理方法取得(很久很久以前,兰德公司就曾以随机脉冲源做信息源,利用电子旋转轮来产生随机数表),但当今最为普遍的乃是在计算机上利用数学方法产生随机数。这种随机数根据特定的迭代公式计算出来,初值确定后,序列就可以预测出来,所以不能算是真正的随机数(就成为“伪随机数”)。不过,在应用中,只要产生的伪随机数列能通过一系列统计检验,就可以把它们当成“真”随机数来用。

本文来源:https://www.bwwdw.com/article/6cvf.html

Top