Python实战:用Python程序实现春晚刘谦魔术

刘谦春晚魔术是一个让人叹为观止的魔术表演,其中涉及到了数学、编程和创意的结合。看了春晚魔术的朋友们,是不是好奇春晚刘谦的魔术是怎么变的。

在这篇文章中,我们将通过 Python 程序实现春晚刘谦魔术,让读者对这个魔术有更深入的了解。

一、导入库

import random
from collections import deque

二、跟着刘谦的步骤写程序

1、打乱13张牌

用一个 cards 列表存放 13 张不一样的牌 [“2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”, “J”, “Q”, “K”, “A”]

使用random.shuffle() 函数,将列表中的元素随机打乱。这个函数会直接修改原始列表,而不是创建一个新的打乱顺序的列表。

import random
cards = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
print(f"最初的的13张牌:{cards}")
random.shuffle(cards)
print(f"打乱顺序的13张牌:{cards}")

Pycharm 控制台输出如下:

2、随机抽取4张牌

使用random.sample() 是 函数,从列表中随机抽取指定数量的元素。这个函数不会修改原始序列,而是返回一个新的包含抽取元素的列表。

from collections import deque# 随机选择4张牌
random_4_cards = random.sample(cards, 4)
print(f"随机抽出的4张牌:{random_4_cards}")

Pycharm 控制台输出如下:

3、将牌对折撕开

创建了一个名为 random_8_cards 的双端队列,其中包含 random_4_cards 的 2 倍元素。

# 对折后撕开得到8张牌
random_8_cards = deque(random_4_cards * 2)
print(f"对折后撕开得到8张牌:{random_8_cards}")

Pycharm 控制台输出如下:

4、根据名字字数得到新顺序牌

使用 collections.deque 类中的rotate() 方法,将双端队列中的元素向左或向右旋转指定的位置。这个方法接受一个参数,表示要旋转的位置数。正数表示向右旋转,负数表示向左旋转。

# 1. 根据名字有几个字,将前几张牌移到最后
name = int(input("请输入名字字数:"))
# 将双端队列中的元素向左旋转几个位置
random_8_cards.rotate(-name)
print(f"根据名字字数调整后的牌:{random_8_cards}")

Pycharm 控制台输出如下:

5、最上面3张插入剩下牌中间

# 2. 取出前三张牌并随机插入剩余牌中,不能插在第一张和最后一张
first_three = [random_8_cards.popleft() for i in range(3)]
print(f"上面3张牌是:{first_three}")
print(f"下面5张牌是:{random_8_cards}")for card in first_three:insert_position = random.randint(1, len(random_8_cards) - 2)random_8_cards.insert(insert_position, card)print(f"插入牌是:{card},随机插入位置是:{insert_position+1},新牌顺序是{random_8_cards}")
print(f"上面3张牌随机插入剩下牌中间,此时新牌顺序:{random_8_cards}")

Pycharm 控制台输出如下:

6、最上面1张牌藏起来

# 3. 把最上面的牌藏起来
remembered_card = random_8_cards.popleft()
print(f"藏起来的1张牌是:{remembered_card}")
print(f"剩下7张牌是:{random_8_cards}")

Pycharm 控制台输出如下:

7、根据南北方得到新顺序牌

# 4. 南方人取1张,北方人取2张,无法确定取3张,将这些牌随机插入剩下的牌中
location = int(input("请输入地区,南方人输入1,北方人输入2,无法确定输入3:"))
first_location = [random_8_cards.popleft() for i in range(location)]
print(f"上面地区牌是:{first_location}")
print(f"剩下牌是:{random_8_cards}")for card in first_location:insert_position = random.randint(1, len(random_8_cards) - 2)random_8_cards.insert(insert_position, card)print(f"插入牌是:{card},随机插入位置是:{insert_position + 1},新牌顺序是{random_8_cards}")
print(f"根据南北方,随机插入剩下牌中间,此时新牌顺序:{random_8_cards}")

Pycharm 控制台输出如下:

8、根据性别得到新顺序牌

# 5. 男生取1张,女生取2张,将这些牌扔掉
gender = int(input("请输入性别,男性输入1,女性输入2:"))
for i in range(gender):random_8_cards.popleft()
print(f"根据性别扔牌,此时新牌顺序:{random_8_cards}")

Pycharm 控制台输出如下:

9、见证奇迹的时刻

"见证奇迹的时刻"是 7 个字,翻译成代码就是将双端队列中的元素向左旋转 7 个位置。

# 6. 见证奇迹的时刻
# 将双端队列中的元素向左旋转7个位置
random_8_cards.rotate(-7)
print(f"见证奇迹的时刻(向左旋转7次牌),此时新牌顺序:{random_8_cards}")

Pycharm 控制台输出如下:

10、好运留下来,烦恼丢出去

# 7. 好运留下来,烦恼丢出去!
while len(random_8_cards) > 1:random_8_cards.append(random_8_cards.popleft())  # 第一张牌移到最后random_8_cards.popleft()  # 删除现在的第一张牌print(f"好运留下来,烦恼丢出去!(第一张牌移到最后,删除现在的第一张牌)此时剩余牌顺序:{random_8_cards}")
print(f"剩余最后1张牌是:{random_8_cards}")

Pycharm 控制台输出如下:

三、完整代码

完整的代码程序如下:

import random
from collections import dequecards = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
print(f"最初的的13张牌:{cards}")
random.shuffle(cards)
print(f"打乱顺序的13张牌:{cards}")# 随机选择4张牌
random_4_cards = random.sample(cards, 4)
print(f"随机抽出的4张牌:{random_4_cards}")
# 对折后撕开得到8张牌
random_8_cards = deque(random_4_cards * 2)
print(f"对折后撕开得到8张牌:{random_8_cards}")# 1. 根据名字有几个字,将前几张牌移到最后
name = int(input("请输入名字字数:"))
# 将双端队列中的元素向左旋转几个位置
random_8_cards.rotate(-name)
print(f"根据名字字数调整后的牌:{random_8_cards}")# 2. 取出前三张牌并随机插入剩余牌中,不能插在第一张和最后一张
first_three = [random_8_cards.popleft() for _ in range(3)]
print(f"上面3张牌是:{first_three}")
print(f"下面5张牌是:{random_8_cards}")for card in first_three:insert_position = random.randint(1, len(random_8_cards) - 2)random_8_cards.insert(insert_position, card)print(f"插入牌是:{card},随机插入位置是:{insert_position + 1},新牌顺序是{random_8_cards}")
print(f"上面3张牌随机插入剩下牌中间,此时新牌顺序:{random_8_cards}")# 3. 把最上面的牌藏起来
remembered_card = random_8_cards.popleft()
print(f"藏起来的1张牌是:{remembered_card}")
print(f"剩下7张牌是:{random_8_cards}")# 4. 南方人取1张,北方人取2张,无法确定取3张,将这些牌随机插入剩下的牌中
location = int(input("请输入地区,南方人输入1,北方人输入2,无法确定输入3:"))
first_location = [random_8_cards.popleft() for i in range(location)]
print(f"上面地区牌是:{first_location}")
print(f"剩下牌是:{random_8_cards}")for card in first_location:insert_position = random.randint(1, len(random_8_cards) - 2)random_8_cards.insert(insert_position, card)print(f"插入牌是:{card},随机插入位置是:{insert_position + 1},新牌顺序是{random_8_cards}")
print(f"根据南北方,随机插入剩下牌中间,此时新牌顺序:{random_8_cards}")# 5. 男生取1张,女生取2张,将这些牌扔掉
gender = int(input("请输入性别,男性输入1,女性输入2:"))
for i in range(gender):random_8_cards.popleft()
print(f"根据性别扔牌,此时新牌顺序:{random_8_cards}")# 6. 见证奇迹的时刻
# 将双端队列中的元素向左旋转7个位置
random_8_cards.rotate(-7)
print(f"见证奇迹的时刻(向左旋转7次牌),此时新牌顺序:{random_8_cards}")# 7. 好运留下来,烦恼丢出去!
while len(random_8_cards) > 1:random_8_cards.append(random_8_cards.popleft())  # 第一张牌移到最后random_8_cards.popleft()  # 删除现在的第一张牌print(f"好运留下来,烦恼丢出去!(第一张牌移到最后,删除现在的第一张牌)此时剩余牌顺序:{random_8_cards}")
print(f"剩余最后1张牌是:{random_8_cards}")# 8. 查看藏起来的1张牌
print(f"藏起来的1张牌是:{remembered_card}")

Pycharm 控制台输出如下:

四、封装函数

我们将上面的代码进行封装,定义一个 magic() 函数,把名字字数定义为随机 1-10 的数字,南北方人为随机 1-3 的数字,性别为随机 1-2 的数字。

在 main 主函数内调用 10 万次 magic()函数,看一下运行结果正确率。

import random
from collections import dequedef magic():cards = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]# print(f"最初的的13张牌:{cards}")random.shuffle(cards)# print(f"打乱顺序的13张牌:{cards}")# 随机选择4张牌random_4_cards = random.sample(cards, 4)# print(f"随机抽出的4张牌:{random_4_cards}")# 对折后撕开得到8张牌random_8_cards = deque(random_4_cards * 2)# print(f"对折后撕开得到8张牌:{random_8_cards}")# 1. 根据名字有几个字,将前几张牌移到最后name = int(random.randint(1, 10))# 将双端队列中的元素向左旋转几个位置random_8_cards.rotate(-name)# print(f"根据名字字数调整后的牌:{random_8_cards}")# 2. 取出前三张牌并随机插入剩余牌中,不能插在第一张和最后一张first_three = [random_8_cards.popleft() for _ in range(3)]# print(f"上面3张牌是:{first_three}")# print(f"下面5张牌是:{random_8_cards}")for card in first_three:insert_position = random.randint(1, len(random_8_cards) - 2)random_8_cards.insert(insert_position, card)#     print(f"插入牌是:{card},随机插入位置是:{insert_position + 1},新牌顺序是{random_8_cards}")# print(f"上面3张牌随机插入剩下牌中间,此时新牌顺序:{random_8_cards}")# 3. 把最上面的牌藏起来remembered_card = random_8_cards.popleft()# print(f"藏起来的1张牌是:{remembered_card}")# print(f"剩下7张牌是:{random_8_cards}")# 4. 南方人取1张,北方人取2张,无法确定取3张,将这些牌随机插入剩下的牌中location = int(random.randint(1, 4))first_location = [random_8_cards.popleft() for i in range(location)]# print(f"上面地区牌是:{first_location}")# print(f"剩下牌是:{random_8_cards}")for card in first_location:insert_position = random.randint(1, len(random_8_cards) - 2)random_8_cards.insert(insert_position, card)#     print(f"插入牌是:{card},随机插入位置是:{insert_position + 1},新牌顺序是{random_8_cards}")# print(f"根据南北方,随机插入剩下牌中间,此时新牌顺序:{random_8_cards}")# 5. 男生取1张,女生取2张,将这些牌扔掉gender = int(random.randint(1, 2))for i in range(gender):random_8_cards.popleft()# print(f"根据性别扔牌,此时新牌顺序:{random_8_cards}")# 6. 见证奇迹的时刻# 将双端队列中的元素向左旋转7个位置random_8_cards.rotate(-7)# print(f"见证奇迹的时刻(向左旋转7次牌),此时新牌顺序:{random_8_cards}")# 7. 好运留下来,烦恼丢出去!while len(random_8_cards) > 1:random_8_cards.append(random_8_cards.popleft())  # 第一张牌移到最后random_8_cards.popleft()  # 删除现在的第一张牌#     print(f"好运留下来,烦恼丢出去!(第一张牌移到最后,删除现在的第一张牌)此时剩余牌顺序:{random_8_cards}")# print(f"剩余最后1张牌是:{random_8_cards[0]}")# 8. 查看藏起来的1张牌# print(f"藏起来的1张牌是:{remembered_card[0]}")return [random_8_cards[0], remembered_card]if __name__ == '__main__':# 进行多次模拟,计算正确率times = 100000correct_match_times = 0for i in range(times):result = magic()if result[0] == result[1]:correct_match_times += 1match_rate = f"{(correct_match_times / times * 100)} % "print(f"运行{times}次,正确率是{match_rate}")

Pycharm 控制台输出如下:

运行 10 万次程序,正确率 100%。

五、总结

通过我们的代码实验,可以看出刘谦的这个魔术纯粹是数学原理,只要按照固定的顺序执行,就一定能拼成完成的牌。

如果您觉得这篇文章对您有所启发或帮助,请不吝点赞、转发,与您的朋友和家人分享。

本文首发在“程序员coding”公众号,欢迎关注与我一起交流学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777909.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Talk|香港科技大学苟耘豪:MoCLE - 指令聚类MoE+通用专家解决多模态大模型任务冲突

本期为TechBeat人工智能社区第571期线上Talk。 北京时间2月8日(周四)20:00,香港科技大学博士生—苟耘豪的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “MoCLE - 指令聚类MoE通用专家解决多模态大模型任务冲突”,系统地介绍…

SAP-PS-02-003跨系统/Client请求传输和请求副本的创建

前言 某公司SAP服务器架构如下(举例),一般进行SAP项目实施基本会遵循以下的系统和Client准则,那在不同系统和Client要如何进行请求传输呢 服务器 Client 作用 要求 DEV 100 业务顾问进行系统配置 所有配置均在该Client进行…

面向工业 X.0 的工业网络简述

此图片来源于网络 1、背景 工业4.0是在21世纪初提出的,特别是在2013年,德国政府正式推出了“工业4.0”战略,旨在通过利用物联网(IoT)等先进技术提高工业的竞争力。因此,我们可以认为工业4.0的实现时间大致…

【C++跬步积累】—— 构造函数+析构函数

🌏博客主页:PH_modest的博客主页 🚩当前专栏:C跬步积累 💌其他专栏: 🔴 每日一题 🟡 每日反刍 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

第9讲 详解第 2 套真题

第9讲 详解第 2 套真题 基本编程题【15 分】简单应用题【25 分】综合应用题【20 分】问题 1【10 分】:问题 2【10 分】:各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 基本编程题【15 分】 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不…

Acwing---837. 连通块中点的数量

连通块中点的数量 1.题目2.基本思想3.代码实现 1.题目 给定一个包含 n n n个点(编号为 1 ∼ n 1∼n 1∼n)的无向图,初始时图中没有边。 现在要进行 m m m 个操作,操作共有三种: C a b,在点 a 和点 b …

python从入门到精通(十):python常见标准库的使用

python数据分析和可视化基础 (一)Python 中处理日期和时间的模块time导入time模块time获取当前时间戳localtime获取当前时间struct_timeasctime获取格式化的时间ctime获取格式化的时间gmtime获取格式化的时间计时器功能strftime格式化日期strptime格式化…

python巧用定理判断素数

目录 判断一个数n是否是素数 求一个数的素因数个数 求大于等于指定数的最小素数 在数论中有三个非常重要的关于素数的定理 1、任何数都可以表示成若干个素数的乘积 2、任意数的素因子一个大于根号n的自然数,另一个与其对应的因子则必小于根号n。 3、除了2和3以…

fast.ai 机器学习笔记(二)

机器学习 1:第 5 课 原文:medium.com/hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618 译者:飞龙 协议:CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更…

企业飞书应用机器人,使用python自动发送文字内容到群消息

文章目录 创建企业应用与开通机器人飞书发送信息的工具函数 创建企业应用与开通机器人 需要先创建应用,然后进入应用后,点击添加应用能力创建机器人: 参考官方文档,获取两个参数:app_id与app_secret 官方说明文档&…

低代码市场的未来展望:趋势、机遇与挑战

根据 Zoho 的一项新研究,低代码市场正处于成为主流的风口浪尖。该报告对全球 800 多名 IT 和业务领导者进行了调查,确定了推动其采用的几个因素。其中最重要的是提高应用程序的开发速度。 这一发现对企业领导者来说应该不足为奇。 客户、合作伙伴和员工…

6 scala-面向对象编程基础

Scala 跟 Java 一样,是一门面向对象编程的语言,有类和对象的概念。 1 类与对象 与 Java 一样,Scala 也是通过关键字 class 来定义类,使用关键字 new 创建对象。 要运行我们编写的代码,同样像 Java 一样,…

4核8g服务器能访问多少人?2024年测评

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

C++数据类型、变量常量

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家新年快乐,今天我们来学习C的数据类型,变量常量。 文章目录 1.数据类型的概念与思想 1.1基本数据类型 1.2复合数据类型 1.3类型修饰符 1.4类型转换 1.4.1static_cast 1.4.2…

【射影几何15】python双曲几何工具geometry_tools

目录 一、说明二、​环境问题:如何安装三、实现一个简单的例子四、绘制双曲组五、使用有限状态自动机加快速度六、资源和代码 一、说明 Geometry_tools 是一个 Python 包,旨在帮助您处理和可视化双曲空间和射影空间上的群动作。 该包主要构建在 numpy、…

【EAI 011】SayCan: Grounding Language in Robotic Affordances

论文标题:Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 论文作者:Michael Ahn, Anthony Brohan, Noah Brown, Yevgen Chebotar, Omar Cortes, Byron David, Chelsea Finn, Chuyuan Fu, Keerthana Gopalakrishnan, Karol Hausm…

【综述】2024 [arXiv] 通用时间序列表示学习

论文标题:Universal Time-Series Representation Learning: A Survey 链接:https://arxiv.org/abs/2401.03717 作者:Patara Trirat, Yooju Shin, Junhyeok Kang, Youngeun Nam, Jihye Na, Minyoung Bae, Joeun Kim, Byunghyun Kim, Jae-Gil…

用Python动态展示排序算法

文章目录 选择冒泡插入排序归并排序希尔排序 经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考这篇 C语言实现各种排序算法[选择&#x…

《雾锁王国》服务器怎么搭建,阿里云一键部署雾锁王国新手教程

上次讲了怎么搭建幻兽帕鲁服务器,今天讲讲如何搭建雾锁王国服务器,其实方法也非常简单,跟幻兽帕鲁一样,都是可以通过一键部署的方式来搭建的。 下面将会讲两种搭建《雾锁王国》服务器的方式,一种是你没有买过服务器&a…

leetcode:51.N皇后

起初会想到暴力,但是N不确定,所以不确定for的嵌套层数,所以我们采用回溯算法。 树形结构: 1.树的深度是第depth层 2.树的宽度是对每一行进行遍历 代码实现: 1.result是三维数组,一个棋盘是二维&#x…