扑克牌洗牌模型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数学模型》课程结业论文
扑克牌洗牌模型
任务书
[要求]
1、将所给的问题翻译成汉语;
2、给论文起个题目(名字或标题)
3、根据任务来完成数学模型论文;
4、论文书写格式要求按给定要求书写;
5、态度要认真,要独立思考,独立完成任务;
6、论文上交时间:6月1日前(要求交纸质论文和电子文档)。
7、严禁抄袭行为,若发现抄袭,则成绩记为“不及格”。
[任务]
一天,魔术师表演了这样一个节目:将一副看起来杂乱无章扑克牌(去掉2个王,52张)排成一列展示给观众,然后将牌合起来(背面朝上),左手将牌上半部分(26张)拿起,右手拿下半部分,把两部分牌相隔一张进行交叉洗牌(背面朝上),第一张是左手拿的。
这样反复洗牌4次,最后将牌展示给观众,牌的排列结果是:♡A,♠A ,♦A ,♣A ,♡2,♠2 ,♦2 ,♣2,…,♡K,♠K,♦K,♣K。
试问原来牌的排列的花色和序号是什么?试用数学方法建立最终的排列结果与最初排列结果之间的关系。
成绩评定单
评语:
成绩
任课教师签字年月日
摘 要
把52张扑克牌看成一维数组,用逆推法推出原来的排列。
设数组a=[1,2,3,4,…,52],对数组进行从新排列。
1,2,3,4分别对应红A,黑A,方
A,梅A,依次类推。
设加权函数(1)1()2
n f n -+=,数组b 和数组c ,()*()a n f n 得到的非零数组c 表示右手拿的部分,()*()a n f n 等零的部分放在数组b 中表示左手拿的部分,重新合为一维新数组,然后重复四次过程,最后得到原来的排列,依次相对应即可推出原来扑克牌的花色和序号。
关键词:排列;逆推;加权函数;
目录
论文正文: (1)
1.1 问题重述 (1)
1.2 符号说明及模型假设 (1)
1.2.1 符号说明 (1)
1.2.2 模型假设 (1)
1.3 问题分析及模型建立 (2)
1.3.1 问题分析 (2)
1.3.2 模型建立 (2)
1.4 模型求解 (3)
1.5 结果 (3)
1.6 优缺点及改进 (5)
1.6.1 优缺点 (5)
1.6.2 改进方法 (5)
参考文献 (6)
附录 (7)
论文正文:
扑克牌洗牌模型
1.1 问题重述
将一副扑克牌(52张)均分成两部分,左手拿上半部分,右手
拿下部分,把两部分牌相隔一张进行交叉洗牌(背面朝上),第一张是左手拿的。
这样反复洗牌4次,最后将牌展示给观众,牌的排列结果是:♡A ,♠A ,♦A ,♣A ,♡2,♠2 ,♦2 ,♣2,…, ♡K , ♠K , ♦K , ♣K 。
用数学方法建立最终的排列结果与最初排列结果之间的关系。
这是一个从新排列的问题,把一副扑克牌抽象成一组数,用数学方法,对结果进行分析,然后建立模型求出洗牌前的排列。
1.2 符号说明及模型假设
1.2.1 符号说明
(),,a b c f n n i k --------------------------表示数组,即每次洗牌前的排列
表示数组,每次洗牌后左手拿的部分
表示数组,每次洗牌后右手拿的部分
加权函数
用来作循环计算
1.2.2 模型假设
为了简化问题,我们可以先忽略花色和排列,就把52张扑克牌看成一维数组,简化成数组之后,我们就可以用数学方法对数组进行计算了。
可以用逆推法推出原来的排列。
设数组a=[1,2,3,4,…,52],用逆推法对数组进行从新排列。
1,2,3,4分别对应红A,黑A,方A,梅A,依次类推。
设加权函数(1)1()2
n f n -+=,数组b 和数组c ,()*()a n f n 得到的非零数组c 表示右手拿的部分,()*()a n f n 等零的部分放在数组b 中表示左手拿的部分,重新合为一维新数组,然后重复四次过程,最后得到原来的排列,依次相对应即可推出原来扑克牌的花色和序号。
1.3问题分析及模型建立
1.3.1问题分析
已知经过四次洗牌后得到的结果为♡A,♠A ,♦A ,♣A ,♡2,♠2 ,♦2 ,♣2,…,♡K,♠K,♦K,♣K。
要想得到洗牌前排的排列和花色,很显然要用逆推的方法。
按照洗牌规则,逆推出洗牌前的排列和花色。
洗牌规则是:左手将牌上半部分(26张)拿起,右手拿下半部分,把两部分牌相隔一张进行交叉洗牌(背面朝上),第一张是左手拿的。
我们只要想办法交叉的牌分开,就能逆推出原来的排列和花色。
1.3.2模型建立
我们把52张扑克牌看成一个一维数组,1,2,3,4分别对应红A,黑A,方A,梅A,依次类推。
这样我们就可以用数学方法建立洗牌前后的关系了。
设数组a=[1,2,3,4,…,52],加权函数f(n)=((-1)^n+1)/2。
如果a*f(n)==0,我们就把这些数拿出来放到数组b中;
如果a*f(n)!=0,我们就把这些数拿出来放到数组c中;
然后把数组b和c重新组成一组新的排列,b中的数在前,c中的数在后;
重复上述过程4次,就可得到最初的排列;
最后按照假设的对应法则还原成扑克牌的排列和花色。
按照上述方法我们就可以编程把洗完后交叉的牌分离开分别放到数组b和c中,然后在组成一个新的一维数组。
在matlab中编程:
k=0;i=26;c=[];b=[];
for n=1:52
a(n)=n;
if a(n)*(((-1)^n+1)/2)==0
k=k+1;
b(k)=a(n);
else
i=i+1;
c(i)=a(n);
end
end
k=26;
for i=27:52
k=k+1;
b(k)=c(i)
end
根据以上程序就可以推出第四次洗牌前的排列和花色,重复四次就可得
到想要的结果。
1.4模型求解
我们假设52张扑克成一组数列,并且1,2,3,4分别对应红A,黑A,方A,梅A,依次类推。
这样就把具体的扑克牌抽象成一组数,然后就可
以用数学方法对数进行计算了。
如果a*f(n)==0,我们就把这些数拿出来放到数组b中;
如果a*f(n)!=0,我们就把这些数拿出来放到数组c中;
然后把数组b和c重新组成一组新的排列,b中的数在前,c中的数在后;
重复上述过程4次,就可得到最初的排列;
最后按照假设的对应法则还原成扑克牌的排列和花色。
所以通过以上模型在matlab中求得最终结果后,按照我们假设的对应规则,一一对应即可得到最终我们想要的扑克牌的排列和花色。
1.5结果
每次计算得到的数组及对应的花色:
第四次洗牌前:
a=[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33, 35,37,39,41,43,45,47,49,51,2,4,6,8,10,12,14,16,18 ,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50, 52];
对应的扑克牌排列及花色:
♡A,♦A,♡2,♦2,♡3,♦3,♡4,♦4,♡5,♦5,♡6,♦6,♡7,♦7,♡8,♦8,♡9,♦9,♡10,♦10,♡J,♦J,♡Q,♦Q,♡K,♦K,♠A,♣A,♠2,♣2,♠3,♣3,♠4,♣4,♠5,♣5,♠6,♣6,♠7,♣7,♠8,♣8,♠9,♣9,♠10,♣10,♠J,♣J,♠Q,♣Q,♠K,♣K. 第三次洗牌前:
a=[1 5 9 13 17 21 25 29 33 37 41 45 49 2 6 10 14 18 22 26 30 34 38 42 46 50 3 7 11 15 19 23 27 31 35 39 43 47 51 4 8 12 16 20 24 28 32 36 40 44 48 52];
对应的扑克牌排列及花色:
♡A,♡2,♡3,♡4,♡5,♡6,♡7,♡8,♡9,♡10,♡J,
♡Q,♡K,♠A, ♠2, ♠3, ♠4, ♠5, ♠6, ♠7, ♠8, ♠9, ♠10, ♠J, ♠Q, ♠K,♦A,♦2,♦3,♦4,♦5,♦6,♦7,♦8,♦9,♦10,♦J,♦Q,♦K,♣A,♣2,♣3,♣4,♣5,♣6,♣7,♣8,♣9,♣10,♣J,♣Q,♣K.
第二次洗牌前:
a=[1 9 17 25 33 41 49 6 14 22 30 38 46 3 11 19 27 35 43 51 8 16 24 32 40 48 5 13 21 29 37 45 2 10 18 26 34 42 50 7 15 23 31 39 47 4 12 20 28 36 44 52];
对应的扑克牌排列及花色:
♡A,♡3,♡5,♡7,♡9,♡J,♡K,♠2, ♠4, ♠6, ♠8, ♠10, ♠Q, ♦A,♦3,♦5,♦7,♦9,♦J,♦K,♣2,♣4,♣6,♣8,♣10,♣Q,♡2,♡4,♡6,♡8,♡10,♡Q,♠A, ♠3, ♠5, ♠7, ♠9, ♠J, ♠K,♦2,♦4,♦6,♦8,♦10,♦Q,♣A,♣3,♣5,♣7,♣9,♣J,♣K.
第一次洗牌前:
a=[1 17 33 49 14 30 46 11 27 43 8 24 40 5 21 37 2 18 34 50 15 31 47 12 28 44 9 25 41 6 22 38 3 19 35 51 16 32 48 13 29 45 10 26 42 7 23 39 4 20 36 52]
对应的扑克牌排列及花色:
♡A,♡5,♡9,♡K,♠4, ♠8, ♠Q, ♦3,♦7,♦J,♣2,♣6,♣10,♡2,♡6,♡10,♠A, ♠5, ♠9, ♠K,♦4,♦8,♦Q,♣3,♣7,♣J,♡3,♡7,♡J,♠2, ♠6, ♠10, ♦A,♦5,♦9,♦K,♣4,♣8,♣Q,♡4,♡8,♡Q,♠3, ♠7, ♠J, ♦2,♦6,♦10,♣A,♣5,♣9,
♣K.
1.6优缺点及改进
1.6.1优缺点
把一副扑克牌看成一维数组,计算得到结果后还要一一对应,还原成扑克牌的排列和花色,才能得到最终结果,这样就比较繁琐,最后处理的时候有点麻烦。
但是把扑克牌抽象成一组数,就可以直接用数学方法计算,可以减少计算环节,如果考虑花色的话,编程的时候就会很麻烦,还是简化成一组数方便用数学方法处理,用数组和加权函数,很容易就可以分开得到所要的结果。
1.6.2改进方法
除了把一副扑克牌抽象成一个数组外,还可以抽象成矩阵,一个一行52列的矩阵。
然后对矩阵进行拆分计算,也能得到最终结果。
参考文献
[1]陈日耀. 金属切削原理. 北京: 机械工业出版社, 1985:33-36
[2]单锋、朱丽梅、田贺。
民国防工业
[3]张钰, 王丹, 张风和等. 一种新的疲劳可靠寿命计算方法.东北大学学报(自然
科学版), 2000, 21(1): 42-45
附录
程序一:k=0;i=26;c=[];b=[];
for n=1:52
a(n)=n;
if a(n)*(((-1)^n+1)/2)==0
k=k+1;
b(k)=a(n);
else
i=i+1;
c(i)=a(n);
end
end
k=26;
for i=27:52
k=k+1;
b(k)=c(i)
end
程序二
a=[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49 ,51,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48, 50,52];
f(n)=((-1)^n+1)/2;b=[];c=[];k=0;i=26;
for n=1:52
if a(n)*f(n)==0
k=k+1;
b(k)=a(n);
else
i=i+1;
c(i)=a(n);
end
end
k=26
for i=27:52
k=k+1;
b(k)=c(i)
end
程序三:
a=[1 5 9 13 17 21 25 29 33 37 41 45 49 2 6 10 14 18 22 26 30 34 38 42 46 50 3 7 11 15 19 23 27 31 35 39 43 47 51 4 8 12 16 20 24 28 32 36 40 44 48 52]; f(n)=((-1)^n+1)/2;b=[];c=[];k=0;i=26;
for n=1:52
if a(n)*f(n)==0
k=k+1;
b(k)=a(n);
else
i=i+1;
c(i)=a(n);
end
end
k=26
for i=27:52
k=k+1;
b(k)=c(i)
end
程序四:
a=[1 9 17 25 33 41 49 6 14 22 30 38 46 3 11 19 27 35 43 51 8 16 24 32 40 48 5 13 21 29 37 45 2 10 18 26 34 42 50 7 15 23 31 39 47 4 12 20 28 36 44 52]; f(n)=((-1)^n+1)/2;b=[];c=[];k=0;i=26;
for n=1:52
if a(n)*f(n)==0
k=k+1;
b(k)=a(n); else
i=i+1;
c(i)=a(n); end
end
k=26
for i=27:52
k=k+1;
b(k)=c(i) end。