实验数据处理方法实验数据处理方法第二部分:第二部分: Monte CarloMonte Carlo 模拟模拟第七章
均匀分布随机数的产生• 随机数的定义和特性• 随机数的产生• 线性乘同余方法
第七章均匀分布随机数的产生7.1 随机数的定义和特性
7.1 7.1 随机数的定义和特性随机数的定义和特性什么是随机数?
单个的数字不是随机数是指一个数列,其中的每一个体称为随机数,其值与数列中的其它数无关;在一个均匀分布的随机数中,每一个体出现的概率是均等的;
例如:在 [0,1] 区间上均匀分布的随机数序列中,0.00001 与 0.5 出现的机会均等
7.1 7.1 随机数的定义和特性随机数的定义和特性随机数应具有的基本特性
考虑一个对高能粒子反应过程的模拟:需用随机数确定:出射粒子的属性:能量、方向、…粒子与介质的相互作用
对这一过程的模拟应满足以下要求(相空间产生过程): 出射粒子的属性应是互不相关的,即每一粒子的属性的确定独立于其它的粒子的属性的确定; 粒子的属性的分布应满足物理所要求的理论分布;
所模拟的物理过程要求随机数应具有下列特性:随机数序列应是独立的、互不相关的 (uncorrelated) :
即序列中的任一子序列应与其它的子序列无关;
7.1 7.1 随机数的定义和特性随机数的定义和特性长的周期 (long period) :
实际应用中,随机数都是用数学方法计算出来的,这些算法具有周期性,即当序列达到一定长度后会重复;均匀分布的随机数应满足均匀性 (Uniformity) :
随机数序列应是均匀的、无偏的,即:如果两个子区间的“面积”相等,则落于这两个子区间内的随机数的个数应相等。例如:对 [0,1) 区间均匀分布的随机数,如果产生了足够多的随机数,而有一半的随机数落于区间 [0,0.1] 不满足均匀性如果均匀性不满足,则会出现序列中的多组随机数相关的情况均匀性与互不相关的特性是有联系的
7.1 7.1 随机数的定义和特性随机数的定义和特性有效性( Efficiency):
模拟结果可靠 模拟产生的样本容量大
所需的随机数的数量大 随机数的产生必须快速、有效,最好能够进行并行计算。
第七章均匀分布随机数的产生7.2 随机数的产生
7.2 7.2 随机数的产生随机数的产生• [0,1] 区间上均匀分布的随机数是 Monte Carlo 模拟的基础 :
•[0,1] 均匀分布的随机数的产生方法:利用一些具有内在的随机性的过程:
放射性衰变过程( radioactive decay) ;热噪声 (thermal noise);宇宙线的到达时间( cosmic ray arrival);…
缺点:模拟的结果不可再现,使得模拟程序的找错困难利用事先制订好的随机数表 :
缺点:表的容量有限,不适合需要大量随机数的应用
服从任意分布的随机数序列可以用 [0,1] 区间均匀分布的随机数序列作适当的变换或舍选后求得
7.2 7.2 随机数的产生随机数的产生),...,,( 11 knnnkn rrrTr
利用数学递推公式在计算机中产生随机数
其中: T 为某个函数,给定初值 r1,r2,…,rk, 可按上式确定 rn+1, n=1,2,… 随机数序列 .
算法:产生 [0 , M] 区间上的整数 In ,然后利用公式 rn
=In/M 返回 [0,1] 区间上的实数优点:
–占用计算机的内存少;–产生速度快;–可以重复前次的模拟结果,便于程序的找错;
7.2 7.2 随机数的产生随机数的产生缺点:
• 不满足随机数之间相互独立的要求:公式和初值确定后,序列就唯一地确定了;
伪随机数( Pseudo-Random Number)
• 不满足均匀性:计算机能表示的 [0,1] 区间内的数是有限的(由字长确定) 递推到一定次数后,出现周期性的重复现象
第七章均匀分布随机数的产生7.3 线性乘同余方法( Linear Congruential Method)
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 乘同余法:速度更快,也可产生长的随机数序列
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,…
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,..
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;}
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);
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();
}
7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)
7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)
如果取 a=69069,将极大地改善结果
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;
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;}
7.3 7.3 线性乘同余方法线性乘同余方法(( Linear Congruential Method)Linear Congruential Method)
a=b=65539, seed0=9, seed1=11
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)
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
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