25
实实实实实实实实 实实实实实实实实 实实实实实实实实Monte Carlo Monte Carlo 实实 实实 实实实 实实实实实实实实实实 实实实实实实实实实 实实实实实实 实实实实实实实

实验数据处理方法 第二部分: Monte Carlo 模拟

  • Upload
    dinah

  • View
    105

  • Download
    6

Embed Size (px)

DESCRIPTION

实验数据处理方法 第二部分: Monte Carlo 模拟. 第七章 均匀分布随机数的产生. 随机数的定义和特性. 随机数的产生. 线性乘同余方法. 第七章 均匀分布随机数的产生. 7.1 随机数的定义和特性. 7.1 随机数的定义和特性. 什么是随机数?. 单个的数字不是随机数. 是指一个数列,其中的每一个体称为随机数,其值与数列中的其它数无关;. 在一个均匀分布的随机数中,每一个体出现的概率是均等的;. 例如:在 [0,1] 区间上均匀分布的随机数序列中, 0.00001 与 0.5 出现的机会均等. 7.1 随机数的定义和特性. - PowerPoint PPT Presentation

Citation preview

Page 1: 实验数据处理方法 第二部分: Monte Carlo 模拟

实验数据处理方法实验数据处理方法第二部分:第二部分: Monte CarloMonte Carlo 模拟模拟第七章

均匀分布随机数的产生• 随机数的定义和特性• 随机数的产生• 线性乘同余方法

Page 2: 实验数据处理方法 第二部分: Monte Carlo 模拟

第七章均匀分布随机数的产生7.1 随机数的定义和特性

Page 3: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.1 7.1 随机数的定义和特性随机数的定义和特性什么是随机数?

单个的数字不是随机数是指一个数列,其中的每一个体称为随机数,其值与数列中的其它数无关;在一个均匀分布的随机数中,每一个体出现的概率是均等的;

例如:在 [0,1] 区间上均匀分布的随机数序列中,0.00001 与 0.5 出现的机会均等

Page 4: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.1 7.1 随机数的定义和特性随机数的定义和特性随机数应具有的基本特性

考虑一个对高能粒子反应过程的模拟:需用随机数确定:出射粒子的属性:能量、方向、…粒子与介质的相互作用

对这一过程的模拟应满足以下要求(相空间产生过程): 出射粒子的属性应是互不相关的,即每一粒子的属性的确定独立于其它的粒子的属性的确定; 粒子的属性的分布应满足物理所要求的理论分布;

所模拟的物理过程要求随机数应具有下列特性:随机数序列应是独立的、互不相关的 (uncorrelated) :

即序列中的任一子序列应与其它的子序列无关;

Page 5: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.1 7.1 随机数的定义和特性随机数的定义和特性长的周期 (long period) :

实际应用中,随机数都是用数学方法计算出来的,这些算法具有周期性,即当序列达到一定长度后会重复;均匀分布的随机数应满足均匀性 (Uniformity) :

随机数序列应是均匀的、无偏的,即:如果两个子区间的“面积”相等,则落于这两个子区间内的随机数的个数应相等。例如:对 [0,1) 区间均匀分布的随机数,如果产生了足够多的随机数,而有一半的随机数落于区间 [0,0.1] 不满足均匀性如果均匀性不满足,则会出现序列中的多组随机数相关的情况均匀性与互不相关的特性是有联系的

Page 6: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.1 7.1 随机数的定义和特性随机数的定义和特性有效性( Efficiency):

模拟结果可靠 模拟产生的样本容量大

所需的随机数的数量大 随机数的产生必须快速、有效,最好能够进行并行计算。

Page 7: 实验数据处理方法 第二部分: Monte Carlo 模拟

第七章均匀分布随机数的产生7.2 随机数的产生

Page 8: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.2 7.2 随机数的产生随机数的产生• [0,1] 区间上均匀分布的随机数是 Monte Carlo 模拟的基础 :

•[0,1] 均匀分布的随机数的产生方法:利用一些具有内在的随机性的过程:

放射性衰变过程( radioactive decay) ;热噪声 (thermal noise);宇宙线的到达时间( cosmic ray arrival);…

缺点:模拟的结果不可再现,使得模拟程序的找错困难利用事先制订好的随机数表 :

缺点:表的容量有限,不适合需要大量随机数的应用

服从任意分布的随机数序列可以用 [0,1] 区间均匀分布的随机数序列作适当的变换或舍选后求得

Page 9: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.2 7.2 随机数的产生随机数的产生),...,,( 11 knnnkn rrrTr

利用数学递推公式在计算机中产生随机数

其中: T 为某个函数,给定初值 r1,r2,…,rk, 可按上式确定 rn+1, n=1,2,… 随机数序列 .

算法:产生 [0 , M] 区间上的整数 In ,然后利用公式 rn

=In/M 返回 [0,1] 区间上的实数优点:

–占用计算机的内存少;–产生速度快;–可以重复前次的模拟结果,便于程序的找错;

Page 10: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.2 7.2 随机数的产生随机数的产生缺点:

• 不满足随机数之间相互独立的要求:公式和初值确定后,序列就唯一地确定了;

伪随机数( Pseudo-Random Number)

• 不满足均匀性:计算机能表示的 [0,1] 区间内的数是有限的(由字长确定) 递推到一定次数后,出现周期性的重复现象

Page 11: 实验数据处理方法 第二部分: Monte Carlo 模拟

第七章均匀分布随机数的产生7.3 线性乘同余方法( Linear Congruential Method)

Page 12: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

mcaII nn mod)(1

caImca

,,0,

0

1948 年由 Lehmer提出的一种产生伪随机数的方法,是最常用的方法。1、递推公式:其中:

I0 : 初始值(种子 seed) a : 乘法器 ( multiplier) c : 增值( additive constant) m : 模数( modulus) mod :取模运算: (aIn+c)除以 m 后的余数a, c 和 m皆为整数 产生整型的随机数序列 , 随机性来源于取模运算

如果 c=0 乘同余法:速度更快,也可产生长的随机数序列

Page 13: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

]1,0[)1(

)1,0[)(

mfloatIr

mfloatIr

nn

nn

1mImI

n

n

2、实型随机数序列:

3 、特点:1 )最大容量为 m : mIn 0

2 )独立性和均匀性取决于参数 a 和 c 的选择例: a=c=I0=7, m=10 7,6,9,0,7,6,9,0,…

Page 14: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

4 、模数 m 的选择:• m 应尽可能地大,因为序列的周期不可能大于 m;

• 通常将 m取为计算机所能表示的最大的整型量,在 32位计算机上, m=231=2x109

5 、乘数因子 a 的选择:1961年, M. Greenberger证明:用线性乘同余方法产生的随机数序列具有周期 m 的条件是:1. c 和 m 为互质数;2. a-1 是质数 p 的倍数,其中 p 是 a-1 和 m 的共约数;3. 如果 m 是 4 的倍数, a-1也是 4 的倍数。例: a=5,c=1,m=16,I0=1 周期 =m=16 1,6,15,12,13,2,11,8,9,14,7,4,5,10,3,0,1,6,15, 12,13,2,..

Page 15: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

RANDU 随机数产生器:31

1 2mod)65539( nn II

1961年由 IBM提出

unsigned long seed = 9;float randu() { const unsigned long a = 65539; const unsigned long m = pow(2,31); unsigned long i1; i1 = (a * seed) % m; seed = i1; return (float) i1/float(m);}

void SetSeed(unsigned long i) { seed = i;}

Page 16: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)存在严重的问题: Marsaglia 效用,存在于所有乘同余方法的产生器void test() { c1 = new TCanvas("c1",“Test of random number generator",200,10,700,900);

pad1 = new TPad("pad1",“one ",0.03,0.62,0.50,0.92,21); pad2 = new TPad("pad2",“one vs one",0.51,0.62,0.98,0.92,21); pad3 = new TPad("pad3",“one vs one vs one",0.03,0.02,0.97,0.57,21);

pad1->Draw(); pad2->Draw(); pad3->Draw();

TH1F * h1 = new TH1F("h1","h1",100,0.0,1.0); TH2F * h2 = new TH2F("h2","h2",100,0.0,1.0,100,0.0,1.0); TH3F * h3 = new TH3F("h3","h3",100,0.0,1.0,100,0.0,1.0,100,0.0,1.0);

Page 17: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

for(int i=0; i < 10000; i++) { float x = randu(); float y = randu(); float z = randu(); h1->Fill(x); h2->Fill(x,y); h3->Fill(x,y,z); } pad1->cd(); h1->Draw(); pad2->cd(); h2->Draw(); pad3->cd(); h3->Draw();

}

Page 18: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

Page 19: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

如果取 a=69069,将极大地改善结果

Page 20: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

mIbIaI nnn mod)( 21

1968年, Marsaglia 对这一问题进行了研究,认为:任何的乘同余产生器都存在这一问题:在三维和三维以上的空间中,所产生的随机数总是集聚在一些超平面上 随机数序列是关联的

对于 32位的计算机,在 d-维空间中超平面的最大数目为d=3 2953d=4 566d=6 120d=10 41

改进措施:将递推公式修改为特点: 1 )需要两个初始值(种子); 2 )周期可大于 m;

Page 21: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

#include <math.h>

unsigned long seed0 = 9;

unsigned long seed1 = 11;

float randac() {

const unsigned long a = 65539;

const unsigned long b = 65539;

unsigned long i2;

unsigned long m = pow(2,31);

i2 = (a * seed1 + b * seed0 ) % m;

seed0 = seed1; seed1 = i2;

return (float) i1/float(m);

}

void SetSeed(unsigned long i0, unsigned long i1) { seed0 = i0; seed1 = i1;}

Page 22: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

a=b=65539, seed0=9, seed1=11

Page 23: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

如何获取 [0,1] 区间均匀分布的随机数产生器:1. 每一个 Monte Carlo 模拟程序软件包都有自带的产生器:

• Jetset(LUND Monte Carlo 模拟系列):利用 Marsaglia 等所提出的算法,周期可达 1043

函数用法: r=rlu(idummy)• Geant3(探测器模拟程序, FORTRAN): 周期 =1018

Call grndm(vec*,len)….

2. 利用 CERN 程序库:• Y=rndm(x): 周期: 5x108

• Y=rn32(dummy): 乘同余法, a=69069,i0=65539• Call ranmar(vec,len): 周期: 1043

• Call ranecu(vec,len,isq)

Page 24: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

CLHEP(Class Library for High Energy Physics) 中的随机数产生器

3. 利用 CLHEP 中的随机数产生器软件包:

http://hepg.sdu.edu.cn/~zhangxy/clhep/html/index.html

Page 25: 实验数据处理方法 第二部分: Monte Carlo 模拟

7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)

FORTRAN 中使用随机数产生器应注意的问题:在 FORTRAN 中,如果随机数产生器是带 dummy 变量的函数:其中变量 idum 在函数中不使用,应注意以下问题:

X=RAND(idum)

FORTRAN编译器在对程序进行优化时:X=RAND(IDUM)+RAND(IDUM) X=2.0*RAND(IDUM)

DO I=1,10 X=RAND(IDUM) …END DO

X=RAND(IDUM)DO I=1,10 ….END DO

解决办法: DO I=1,10

IDUM = IDUM +1

X=RAND(IDUM)

END DO