收藏 分享(赏)

纸牌游戏21点 数学建模.doc

上传人:精品资料 文档编号:9595212 上传时间:2019-08-17 格式:DOC 页数:13 大小:64.42KB
下载 相关 举报
纸牌游戏21点 数学建模.doc_第1页
第1页 / 共13页
纸牌游戏21点 数学建模.doc_第2页
第2页 / 共13页
纸牌游戏21点 数学建模.doc_第3页
第3页 / 共13页
纸牌游戏21点 数学建模.doc_第4页
第4页 / 共13页
纸牌游戏21点 数学建模.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、纸牌游戏 21 点(Blackjack).构造并实施 21 点游戏的蒙特卡洛模拟21 点游戏规则如下:大多数赌场使用 6 副牌或 8 副牌玩这种游戏,以防止“数牌点”,在你的模拟中使用两副牌(共 104 张)。只有 2 位参与者,你和庄家。游戏开始时每人得到两张牌,对于牌面为 210 的牌,点数和面数相同;对于为人脸(J、Q、K)的牌,点数为 10;牌面为 A 的牌,点数为 1 或者 11.游戏的目的是得到总数尽量接近 21 点的牌,不得超过(超过称“爆了”),并使你得到的总点数多于庄家。如果开始两张牌的总点数恰为 21(A-10 或 A-人脸),称为 21 点,自动成为胜者(若你和庄家都得到

2、 21 点,则为平局,你的赌注仍在台上)。靠 21 点赢时,付给你 3 赔 2,即 1.5 赔 1(1 元赌注赢 1.5 元,且 1 元赌注仍保留)。如果你和庄家都未得到 21 点,你想要多少张牌就可以取多少张牌,一次一张,使总数尽量接近 21 点,如果你超过了 21 点,就输了,游戏结束。一旦你对牌的点数满意,你就“打住”,然后庄家按照下列规则取牌:当庄家牌的点数为 17、18、19、20 和 21 时,就打住。若庄家牌的点数小于或等于 16,必然取牌。庄家总把 A 的点数记为 11,除非这样使他或她爆了(这时 A 的点数记为 1)。例如,庄家的 A-6 组合是 17 点,不是 7 点(庄家

3、没有选择权),且庄家必须打住在 17 点上。而若庄家有 A-4 组合(15 点),又拿了一张 K,那么新的总点数是 15,因为 A 回到点数 1(使之不超过 21 点),庄家还要再取牌。如果庄家超过 21 点,你就赢了(赢赌注的钱,每 1 元赌注赢 1 元)。如果庄家的总点数超过你,你将输掉全部赌注。如果庄家和你的总点数相同,为平局(你不输也不赢)。赌场中这个游戏的刺激之处在于,庄家开始的两张牌一张明、一张暗,所以你不知道庄家牌地总点数,必须根据那张明牌赌一把。在这个项目模拟中你不用考虑这种情况,你需要做的是:用两幅牌做 12 次游戏,你可以有无限的赌资(不希望吗?),每次下赌 2 元。两副牌

4、玩过一次后,用两幅新牌(104 张)继续玩。这时记录你的得分(加或者减 X 元),然后下一幅牌从 0 开始。输出是 12次游戏的 12 个结果,可以用平均数或总数决定你的总成绩。你的策略是什么?完全由你决定!可是这里有一招假定庄家的牌你都看不到(于是你没有庄家牌这一点信息)。选择一种游戏策略并在整个模拟中运行。给出模拟算法的说明书、计算机程序以及 12 次游戏的输出结果。1、模型的建立与求解21 点的蒙特卡罗算法输出 玩家的得分 SCORE第 1 步 初始化:COUNTER=0.第 2 步 得到1,13内的随机数 .计算 的和21,xy21,xSUM1(玩家总点数 ), 的和 SUM2(庄家总

5、点数 );同ix21,yiy时庄家现出自己的第一张牌 .第 3 步 判断 的值,若10,则将其值改为 10,并重新计算1xSUM1.第 4 步 判断 的值,若10,则将其值改为 10,并重新计算2xSUM1.第 5 步 判断 的值,若10,则将其值改为 10,并重新计算1ySUM2.第 6 步 判断 的值,若10,则将其值改为 10,并重新计算2ySUM2.第 7 步 判断 的值是否为 1,若等于 1 将其值改为 11,重新计1x算 SUM1,并判断 SUM1 是否大于 21,若大于 21 则将 改为 1,并重x新计算 SUM1,若没有大于 21 则继续第 9 步;若 不为 1,直接进行x第

6、9 步.第 8 步 判断 的值是否为 1,若等于 1 将其值改为 11,重新计2x算 SUM1,并判断 SUM1 是否大于 21,若大于 21 则将 改为 1,并重2x新计算 SUM1,若没有大于 21 则继续第 10 步;若 不为 1,直接进行第 10 步.第 9 步 判断 的值是否为 1,若等于 1 将其值改为 11,重新计1y算 SUM2,并判断 SUM2 是否大于 21,若大于 21 则将 改为 1,并重y新计算 SUM2,若没有大于 21 则继续第 11 步;若 不为 1,直接进行第 11 步.第 10 步 判断 的值是否为 1,若等于 1 将其值改为 11,重新2y计算 SUM2,

7、并判断 SUM2 是否大于 21,若大于 21 则将 改为 1,并2y重新计算 SUM2,若没有大于 21 则继续第 12 步;若 不为 1,直接进行第 12 步.第 11 步 玩家判断 SUM1 是否大于等于 18 或大于庄家第一张牌的两倍,若是则玩家停止取牌,跳到第 14 步;若没有则继续取牌,1y得到1,13内的随机数 ,进行第 13 步.ix第 12 步 同第 4 步和第 8 步,判断 的值,若10,则将其值ix改为 10,并将其值加到 SUM1;接着判断 的值是否为 1,若,等于 1i将其值改为 11,重新计算 SUM1,并判断 SUM1 是否大于 21,若大于21 则将 改为 1,

8、并重新计算 SUM1,若没有大于 21 则回到第 12 步;ix若 不为 1,直接进行第 12 步.i第 13 步 庄家判断 SUM2 是否大于 16,若是则庄家不取牌,则跳到第 16 步;否则庄家取牌,得到1,13内的随机数 ,进行第iy15 步.第 14 步 同第 6 步和第 10 步,判断 的值,若10,则将其值iy改为 10,并将其值加到 SUM2;接着判断 的值是否为 1,若,等于 1i将其值改为 11,重新计算 SUM1,并判断 SUM2 是否大于 21,若大于21 则将 改为 1,并重新计算 SUM2,若没有大于 21 则回到第 14 步;iy若 不为 1,直接回到第 14 步.

9、i第 15 步 比较 SUM1 和 SUM2 的大小,If ( SUM121 %产生 8*13 的矩阵numz=0;numw=0;pz=;pw=;totz=0; %庄家总点数totw=0; %玩家总点数numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);while 1if (

10、totw18)|(totw (2*pz(1) )break;elsenumw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);endendwhile 1if (totz=17)else if (totw=21 else if (totz=21else if 21totw else if 21totw endendendendendfprintf(玩家得分 SCORE=%dn,SCORE);保存为 dian21.m同样 edit 建立函数程序 choose.m 如下function num,p,a=choose(num,p,a)while 1m=fix(ran

11、d(1)*8)+1;n=fix(rand(1)*13)+1;if a(m,n)=1a(m,n)=0;num=num+1;if n=1 if num10n=10;end p=p n;break;endend保存为 choose.m然后在 matlab 中输入 dian21,回车就可以得到如下数据 dian21玩家总点数 SUM1=20玩家总点数 SUM1=17玩家得分 SCORE=2 dian21玩家总点数 SUM1=20玩家总点数 SUM1=22玩家得分 SCORE=0 dian21玩家总点数 SUM1=20玩家总点数 SUM1=19玩家得分 SCORE=2 dian21玩家总点数 SUM1=

12、15玩家总点数 SUM1=22玩家得分 SCORE=0 dian21玩家总点数 SUM1=19玩家总点数 SUM1=19玩家得分 SCORE=0 dian21玩家总点数 SUM1=14玩家总点数 SUM1=18玩家得分 SCORE=-2这些数据都是随机出现的。这种方法并不是很好,下面对上述游戏策略进行该进。程序如下先输入 edit,在弹出的窗口中输入函数程序 dian21.m 如下function y=dian21() n=input(请输入局数:);SUM=0;flag=input(请输入决策数:); %这是一个决策数,我们可以改变其值,测试哪一个值最优for i=1:na=ones(8,1

13、3); %产生 8*13 的矩阵numz=0;numw=0;pz=;pw=;totz=0; %庄家总点数totw=0; %玩家总点数numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);while 1if (totwflag)%|(totw (2*pz(1) )break;el

14、senumw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);endendwhile 1if (totz=17)else if (totw=21 else if (totz=21endendendendendSUM=SUM+SCORE;%fprintf(玩家得分 SCORE=%dn,SCORE);end fprintf(玩家得分平均值 SCORE=%dn,SUM/n);保存为 dian21.m同样 edit 建立函数程序 choose.m 如下:function num,p,a=choose(num,p,a)while 1m=fix(rand(1)*8)+1

15、;n=fix(rand(1)*13)+1;if a(m,n)=1a(m,n)=0;num=num+1;if n=1 if num10n=10;end p=p n;break;endend保存为 choose.m然后在 matlab 中输入 dian21,回车会出现:请输入局数:你填一个数字,例如 100000会出现:请输入决策数:你再填一个数字,例如 21就会显示:玩家得分平均值 SCORE=-1.351880e+00例: dian21请输入局数:100000请输入决策数:21玩家得分平均值 SCORE=-1.351880e+00 dian21请输入局数:100000请输入决策数:20玩家得分

16、平均值 SCORE=-9.434000e-01 dian21请输入局数:100000请输入决策数:19玩家得分平均值 SCORE=-3.226500e-01 dian21请输入局数:100000请输入决策数:18玩家得分平均值 SCORE=-1.038300e-01 dian21请输入局数:100000请输入决策数:17玩家得分平均值 SCORE=3.641000e-02 dian21请输入局数:100000请输入决策数:16玩家得分平均值 SCORE=5.810000e-02 dian21请输入局数:100000请输入决策数:15玩家得分平均值 SCORE=3.657000e-02 dian21请输入局数:100000请输入决策数:14玩家得分平均值 SCORE=2.397000e-02 dian21请输入局数:100000请输入决策数:13玩家得分平均值 SCORE=-1.116000e-02 dian21请输入局数:100000请输入决策数:12玩家得分平均值 SCORE=-3.628000e-02可见,在决策数 16 时玩家的平均得分最高。所以最终决策是:玩家的总点数大于 16 就停止取牌

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报