刘谦春晚魔术解密及Python实现脚本

相信大家应该已经看了今年刘谦的春晚魔术,这个魔术可以说是很有意思,那么刘谦春晚魔术是什么原理呢?来看看刘谦春晚魔术解密及Python实现脚本,本文将深度揭秘一下刘谦春晚的这个魔术,并且通过一个脚本,更直观的重新演示一下这个魔术。

刘谦春晚魔术解密

首先我们先来解密一下

刘谦春晚魔术解密及Python实现脚本插图

魔术操作步骤:

  • 步骤 1:将准备好的 4 张扑克牌平均撕成两份,并叠在一起。

  • 步骤 2:将牌堆顶数量为【名字字数】的牌移至牌堆底。

  • 步骤 3:将前三张牌放在牌堆中间并取出牌堆顶的牌,放置在一旁。

  • 步骤 4:取出牌堆顶的若干张牌插入牌堆中间,此处选择的牌数为南方人取 1 张,北方人取 2 张,若不确定是南方人还是北方人取 3 张。

  • 步骤 5:男生扔掉牌堆顶 1 张,女生扔掉牌堆顶 2 张。

  • 步骤 6:执行“见证奇迹的时刻”循环,每说一个字,取出牌堆顶一张牌放置在牌堆底。

  • 步骤 7:从牌堆顶开始,每次先将牌堆顶的一张牌放在牌堆底,再扔掉牌堆顶的一张牌,重复以上操作直到只剩一张牌,检查此牌和放置在一旁的牌是否吻合。若吻合,则魔术成功。

简单来讲这个魔术是一个数学原理而已,以往他的魔术都是一些物理的原理,本次魔术可能是数学原理,我们来列一下数学公式,通过公式进行计算。

约瑟夫环(Josephus Problem)有关。约瑟夫环是一个经典的理论问题,在这个问题中,人们围成一个圈,并按照特定的规则依次淘汰或选择某个人,最后剩余一人。

在春晚魔术揭秘的相关讨论中,提到了一种基于约瑟夫环的公式来预测最后幸存者的位置。公式如下:

设N个人按顺时针顺序编号并连成一个环,从第一个人开始按照某个规律(例如:每次掉左手边的人)淘汰人,直到最后只剩下一个人。若N可以表示为N = a + 2^n(其中a < 2^n),则最后活下来的人的位置序号F可以通过以下公式计算得出:

F = 2a + 1

这个公式说明了如何通过给定的总人数N计算出最后幸存者的号码。

举例来说:

① 若牌堆总数N=6=2+2^2,则a=2,n=2,代入公式得F=2a+1=5,即位于第5个位置的会是最后保留下来的。

② 若牌堆总数N=5=1+2^2,则a=1,n=2,代入公式得F=2a+1=3,即位于第3个位置的是最后保留的。

当然,实际魔术过程中可能结合了更多的舞台技巧、心理误导和其他数学方法以增强效果,上述只是针对约瑟夫环问题这一数学模型在魔术中的应用解释。

刘谦春晚魔术Python实现脚本

那么接下来我们来写一个Python脚本来实现这个过程,脚本如下

# 2024春晚刘谦纸牌魔术
import random
q=[]
head=tail=0        #创建队列q
while len(q) !=4:  #随机生成4张牌
    num=random.randint(1,13)
    if num not in q:
        q.append(num)
        tail=tail+1
print(f"随机抽4张牌,分别是{q}")
random.shuffle(q)
print(f"打乱顺序,当前牌池是{q}")
for i in range(4):
    q.append(q[i])
    tail=tail+1
print(f"对折后撕开,当前牌池是{q}")
#输入当前信息
name=input("请输入你的姓名")
sex=input("请输入你的性别")
print(f"当前名字长度是{len(name)}")
for i in range(len(name)):
    q.append(q[head])
    head+=1
    tail+=1
print(f"按照名字移动后,当前牌池是{q[head:tail]}")
p=[]  #
for i in range(3):
    p.append(q[head])
    head+=1
s=tail-head
for i in range(s//2):
    q.append(q[head])
    head+=1
    tail+=1
for i in range(len(p)):
    q.append(p[i])
    tail+=1
for i in range(s-s//2):
    q.append(q[head])
    head+=1
    tail+=1
print(f"取三张牌放中间后,当前牌池是{q[head:tail]}")
key=q[head]
head+=1  #第一张藏好,放在key中
print(f"藏好的牌为{key},当前牌池是{q[head:tail]}")
k=random.randint(1,3)
print(f"南方人取1张牌放中间,北方人取2张牌放中间,其他取3张牌放中间")
print(f"随机取{k}张放中间")
p=[]  #
for i in range(k):
    p.append(q[head])
    head+=1
s=tail-head
for i in range(s//2):
    q.append(q[head])
    head+=1
    tail+=1
for i in range(len(p)):
    q.append(p[i])
    tail+=1
for i in range(s-s//2):
    q.append(q[head])
    head+=1
    tail+=1
print(f"当前牌池是{q[head:tail]}")
if sex == "男":
    head+=1
else:
    head+=2
print(f"性别是{sex},丢掉了牌之后当前牌池是{q[head:tail]}")
print(f"见证奇迹的时刻")
print(f"把第1张牌放末尾7次")
for i in range(7):
    q.append(q[head])
    head+=1
    tail+=1
print(f"当前牌池是{q[head:tail]}")
print(f"好运留下来,烦恼全扔掉!")
print(f"把第1张牌放末尾,第二张牌扔掉。")
while head+1 != tail:
    q.append(q[head])
    head+=1
    tail+=1
    q.append(q[head])
    head+=1
print(f"藏好的牌为{key},当前牌池是{q[head:tail]}")

脚本演示图如下

刘谦春晚魔术解密及Python实现脚本插图1 刘谦春晚魔术解密及Python实现脚本插图2

 

© 版权声明
THE END
喜欢就亲吻一下吧
分享
评论 抢沙发
头像
评论一下幻城的文章吧
提交
头像

昵称

取消
昵称代码图片

    暂无评论内容