计算机模拟法相关知识----怎样产生随机数?
用计算机模拟法解题时,通常需要用机器模拟产生服从题给概率分布的随机数。如:顾客对车的需求量是x辆/天,x是从0至99的均匀分布随机数,可用Matlab语句x=fix(rand(1,1)*100)来产生.
Matlab中,rand命令产生开区间(0,1)上均匀分布随机数,在此基础上,灵活应用rand命令可以产生许多其它性质的随机数据。下面三个例题,介绍了三种性质的随机数据的产生方法。学生要认真学习、深刻体会。
例1:y是一个随机数,它的取值及相应的概率分布如下:
============================================
y的取值,2 6 8 10
概 率,0.13 0.26 0.56 0.05
============================================
请建立函数文件 sjhs.m,产生数据y,
分析说明:用rand命令产生一个数a,则a属于开区间(0,1),现将这个大区间分割为4个小区间 (0,0.13),(0.13,0.39),(0.39,0.95),(0.95,1),注意到这4个小区间之宽度分别就等于题给的4个概率。 问你,这个a落在第1个小区间的概率是几?落在第3个小区间的概率又是几? 设计思想:a落在第几个小区间就令y取值为2、6、8、10中的第几个数。
函数文件(程序):
function y=sjhs
a=rand(1,1);
if a<0.13
y=2;
elseif a<0.39
y=6;
elseif a<0.95
y=8;
else
y=10;
end
例2:随机组队问题
某校派30名学生组成10个队外出参加一个知识竞赛。该竞赛的规则是每3人组成一个队。竞赛涉及的知识分4大类:自然科学、社会科学、文学、艺术。这4类知识在题目中所占比重相同。已知这30人的成绩:
***********************************************************************
学生代号:01 02 03 04 05 06 07 08 ……… 27 28 29 30
自然科学:90 59 76 70 88 82 69 50 ……… 66 85 71 80
社会科学:85 69 76 84 89 81 57 67 ……… 73 69 79 76
文 学:67 88 52 65 84 50 55 58 ……… 80 66 86 86
艺 术:69 90 70 68 86 72 58 78 ……… 71 88 85 77
***********************************************************************
根据经验,假定在一个队内,某类知识3人的成绩较高的两个成绩的平均值代表该队的该类知识水平。一个队的4类知识水平之和为该队的竞赛水平。问怎样组队,可使10个队的竞赛水平之和达到最大?
分析说明:把30人等分成10组,共有几种分赔方案? 答共有种。若要对全部方案都进行计算检验,则短时间内算不完。现在介绍一种比较粗糙但行之有效的方法来求出近似最佳方案:随机产生一个方案,将30人分成10个队,计算出该方案的竞赛水平;这样的工作重复多次(如:数万次、数十万次),输出竞赛水平最高的方案。此算法的核心是“怎样将30人随机地分成10个队”。
将30人随机地分成10个队:所有人都编号,分别记为1号、2号、3号、……、30号。构造一个2行30列型的矩阵,第1行为 1 2 3 4 …… 30,第2行元素为30个在开区间(0,1)上均匀分布的随机数。再把该矩阵的30个列调序,使得第2行元素为从小到大排列,此时,令第1行的30元素每相邻的3个组成一队即可。
A=[1:30;rand(1,30)];B=sortrows(A',2)';b=B(1,:);
for i=0:9
G(i+1,:)=[b(3*i+1),b(3*i+2),b(3*i+3)];
end
G
例3:电梯环行一周所需时间一个办公大楼,第3层至第12层的上班人数分别是
230,170,320,280,180,180,170,120,90,60.
一台电梯速度为200(单位:m/min)。 只关注上午上班高峰期的需求,电梯从1层满载20人只管送人上楼到4—12层,一旦变空就立刻下行到1层中途不停。已知如下参数:第一层楼高7.62m,第2----11每层楼高3.91m,电梯起动、停止的加速度均为1.22m/s.s,开、关门时间分别为3s,每位乘客进电梯需要1s,出电梯需要0.8s,请用计算机模拟运行,电梯环行一周平均需要多长时间?
分析:核心是要随机产生每个层出电梯的人数,方法如下:总共10层,每层的上班人数在总人数中的比例已知,把开区间(0,1)分割为10个小区间,小区间的宽度分别对应那10个比例数;用命令rand(1,20)产生的20个随机数,有几个落在第i个小区间就表示在第2+i层出电梯的人数是几。
随机产生每个层出电梯的人数:程序如下
clear
rs=[230,170,320,280,180,180,170,120,90,60];bl=rs/sum(rs);
fgd(1)=0;
for j=1:10
fgd(j+1)=fgd(j)+bl(j);
end
sjs=rand(1,20);
cdt=zeros(1,10);
for i=1:20
for j=1:10
if sjs(i)>fgd(j)&sjs(i)<fgd(j+1)
cdt(j)=cdt(j)+1;
end
end
end
[3:12;cdt]
运行该程序,得到这样一个输出:(第一行是楼层,第二行是出电梯人数)
3 4 5 6 7 8 9 10 11 12
1 3 4 2 0 4 1 1 3 1
再运行一次,结果当然会有变化:
3 4 5 6 7 8 9 10 11 12
6 2 4 2 2 0 2 2 0 0
完毕。
题,某报童以每份0.3元的价格买进报纸,以0.5元的价格出售,根据长期统计,报纸每天的销售量及百分率为
销售量
200
210
220
230
240
250
百分率
0.10
0.20
0.40
0.15
0.10
0.05
已知当天销售不出去的报纸,将以每份0.2元的价格退还报社.试用模拟方法确定报童每天买进多少份报纸,能使平均总收入最大?
clear
mjj=0.3;xsj=0.5;thj=0.2;
zdpjsr=0;
for mjs=200:250
zsr=0;
for i=1:20000
a=rand(1,1);
if a<0.1
xss=200;
elseif a<0.3
xss=210;
elseif a<0.7
xss=220;
elseif a<0.85
xss=230;
elseif a<0.95
xss=240;
else
xss=250;
end
if mjs<xss
xss=mjs;
end
sr=xss*xsj-mjs*mjj+(mjs-xss)*thj;
zsr=zsr+sr;
end
pjsr=zsr/20000;
if pjsr>zdpjsr
zdpjsr=pjsr;zjmjs=mjs;
end
end
[zjmjs,zdpjsr]
ans = 222.0000 42.8111
ans = 222.0000 42.8048
ans = 220.0000 42.7967
ans = 220.0000 42.7942
ans = 220.0000 42.7979
用计算机模拟法解题时,通常需要用机器模拟产生服从题给概率分布的随机数。如:顾客对车的需求量是x辆/天,x是从0至99的均匀分布随机数,可用Matlab语句x=fix(rand(1,1)*100)来产生.
Matlab中,rand命令产生开区间(0,1)上均匀分布随机数,在此基础上,灵活应用rand命令可以产生许多其它性质的随机数据。下面三个例题,介绍了三种性质的随机数据的产生方法。学生要认真学习、深刻体会。
例1:y是一个随机数,它的取值及相应的概率分布如下:
============================================
y的取值,2 6 8 10
概 率,0.13 0.26 0.56 0.05
============================================
请建立函数文件 sjhs.m,产生数据y,
分析说明:用rand命令产生一个数a,则a属于开区间(0,1),现将这个大区间分割为4个小区间 (0,0.13),(0.13,0.39),(0.39,0.95),(0.95,1),注意到这4个小区间之宽度分别就等于题给的4个概率。 问你,这个a落在第1个小区间的概率是几?落在第3个小区间的概率又是几? 设计思想:a落在第几个小区间就令y取值为2、6、8、10中的第几个数。
函数文件(程序):
function y=sjhs
a=rand(1,1);
if a<0.13
y=2;
elseif a<0.39
y=6;
elseif a<0.95
y=8;
else
y=10;
end
例2:随机组队问题
某校派30名学生组成10个队外出参加一个知识竞赛。该竞赛的规则是每3人组成一个队。竞赛涉及的知识分4大类:自然科学、社会科学、文学、艺术。这4类知识在题目中所占比重相同。已知这30人的成绩:
***********************************************************************
学生代号:01 02 03 04 05 06 07 08 ……… 27 28 29 30
自然科学:90 59 76 70 88 82 69 50 ……… 66 85 71 80
社会科学:85 69 76 84 89 81 57 67 ……… 73 69 79 76
文 学:67 88 52 65 84 50 55 58 ……… 80 66 86 86
艺 术:69 90 70 68 86 72 58 78 ……… 71 88 85 77
***********************************************************************
根据经验,假定在一个队内,某类知识3人的成绩较高的两个成绩的平均值代表该队的该类知识水平。一个队的4类知识水平之和为该队的竞赛水平。问怎样组队,可使10个队的竞赛水平之和达到最大?
分析说明:把30人等分成10组,共有几种分赔方案? 答共有种。若要对全部方案都进行计算检验,则短时间内算不完。现在介绍一种比较粗糙但行之有效的方法来求出近似最佳方案:随机产生一个方案,将30人分成10个队,计算出该方案的竞赛水平;这样的工作重复多次(如:数万次、数十万次),输出竞赛水平最高的方案。此算法的核心是“怎样将30人随机地分成10个队”。
将30人随机地分成10个队:所有人都编号,分别记为1号、2号、3号、……、30号。构造一个2行30列型的矩阵,第1行为 1 2 3 4 …… 30,第2行元素为30个在开区间(0,1)上均匀分布的随机数。再把该矩阵的30个列调序,使得第2行元素为从小到大排列,此时,令第1行的30元素每相邻的3个组成一队即可。
A=[1:30;rand(1,30)];B=sortrows(A',2)';b=B(1,:);
for i=0:9
G(i+1,:)=[b(3*i+1),b(3*i+2),b(3*i+3)];
end
G
例3:电梯环行一周所需时间一个办公大楼,第3层至第12层的上班人数分别是
230,170,320,280,180,180,170,120,90,60.
一台电梯速度为200(单位:m/min)。 只关注上午上班高峰期的需求,电梯从1层满载20人只管送人上楼到4—12层,一旦变空就立刻下行到1层中途不停。已知如下参数:第一层楼高7.62m,第2----11每层楼高3.91m,电梯起动、停止的加速度均为1.22m/s.s,开、关门时间分别为3s,每位乘客进电梯需要1s,出电梯需要0.8s,请用计算机模拟运行,电梯环行一周平均需要多长时间?
分析:核心是要随机产生每个层出电梯的人数,方法如下:总共10层,每层的上班人数在总人数中的比例已知,把开区间(0,1)分割为10个小区间,小区间的宽度分别对应那10个比例数;用命令rand(1,20)产生的20个随机数,有几个落在第i个小区间就表示在第2+i层出电梯的人数是几。
随机产生每个层出电梯的人数:程序如下
clear
rs=[230,170,320,280,180,180,170,120,90,60];bl=rs/sum(rs);
fgd(1)=0;
for j=1:10
fgd(j+1)=fgd(j)+bl(j);
end
sjs=rand(1,20);
cdt=zeros(1,10);
for i=1:20
for j=1:10
if sjs(i)>fgd(j)&sjs(i)<fgd(j+1)
cdt(j)=cdt(j)+1;
end
end
end
[3:12;cdt]
运行该程序,得到这样一个输出:(第一行是楼层,第二行是出电梯人数)
3 4 5 6 7 8 9 10 11 12
1 3 4 2 0 4 1 1 3 1
再运行一次,结果当然会有变化:
3 4 5 6 7 8 9 10 11 12
6 2 4 2 2 0 2 2 0 0
完毕。
题,某报童以每份0.3元的价格买进报纸,以0.5元的价格出售,根据长期统计,报纸每天的销售量及百分率为
销售量
200
210
220
230
240
250
百分率
0.10
0.20
0.40
0.15
0.10
0.05
已知当天销售不出去的报纸,将以每份0.2元的价格退还报社.试用模拟方法确定报童每天买进多少份报纸,能使平均总收入最大?
clear
mjj=0.3;xsj=0.5;thj=0.2;
zdpjsr=0;
for mjs=200:250
zsr=0;
for i=1:20000
a=rand(1,1);
if a<0.1
xss=200;
elseif a<0.3
xss=210;
elseif a<0.7
xss=220;
elseif a<0.85
xss=230;
elseif a<0.95
xss=240;
else
xss=250;
end
if mjs<xss
xss=mjs;
end
sr=xss*xsj-mjs*mjj+(mjs-xss)*thj;
zsr=zsr+sr;
end
pjsr=zsr/20000;
if pjsr>zdpjsr
zdpjsr=pjsr;zjmjs=mjs;
end
end
[zjmjs,zdpjsr]
ans = 222.0000 42.8111
ans = 222.0000 42.8048
ans = 220.0000 42.7967
ans = 220.0000 42.7942
ans = 220.0000 42.7979