2024龙年春晚刘谦魔术数学建模

大年初一退役数学建模er究竟在干啥呢,昨晚看刘谦魔术不舍得撕坏一副好牌,毕竟当时还在打呢

但是我可以用代码模拟啊

看着网上各路大神什么Josephus环啊,线代啊,甚至还有高考数列题(大学生看得津津有味嗷)……各显神通,现在我就用MATLAB实现这样一个过程(完整代码直接放在最后,可能有可以优化的地方,但是毕竟大年初一拜年要紧,大家评论区直接改就行)

首先准备牌嘛,那就\left[a,b,c,d \right ]好了

2024龙年春晚刘谦魔术数学建模_第1张图片

第一步,撕牌!

2024龙年春晚刘谦魔术数学建模_第2张图片

第二步,按照名字个数换底,按小尼老师为例,nName = 7;

2024龙年春晚刘谦魔术数学建模_第3张图片

第三步,前三张随便乱插

2024龙年春晚刘谦魔术数学建模_第4张图片

然后把第一个一半藏到屁股底下(bushi

第四步,按南北方随便乱插

2024龙年春晚刘谦魔术数学建模_第5张图片

第五步,男生丢掉1张,女生丢掉2张,这里用的randi(2),这次运行是女生诶

2024龙年春晚刘谦魔术数学建模_第6张图片

第六步,大声喊出“见证奇迹的时刻”!连换7次

2024龙年春晚刘谦魔术数学建模_第7张图片

第七步,好运留下来,烦恼丢出去!

2024龙年春晚刘谦魔术数学建模_第8张图片

这样就有了另一半:

2024龙年春晚刘谦魔术数学建模_第9张图片

也祝大家幸福快乐地度过每一天!

附上代码:

clear
clc
cards = ['a', 'b', 'c', 'd']'
%% 撕牌
tearStack = [eye(4); eye(4)];
first = char(tearStack * cards)

%% 按名字个数换底
nName = 7;
bottom = [[zeros(7, 1); 1], [eye(7); zeros(1, 7)]];
second = char(bottom ^ nName * first)

%% 前三张插入在第inserPos张后
insertPos = randi([4, 7]);
third = [second(4:insertPos); second(1:3); second(insertPos + 1:end)]

%% 藏好第一半
half1 = third(1)

%% 按南北方插牌
location = randi(3);
insertPos2 = randi([location + 1, 7]);
fourth = [third(location + 1:insertPos2);
          third(1:location);
          third(insertPos2 + 1:end)]

%% 男生丢1张,女生丢2张
gender = randi(2);
fifth = fourth;
fifth(1:gender) = []

%% 见证奇迹的时刻
bottom2 = [[zeros(7 - gender, 1); 1], [eye(7 - gender); zeros(1, 7 - gender)]];
magicMomentWord = 7;
sixth = char(bottom2 ^ magicMomentWord * fifth)

%% 好运留下来,烦恼丢出去:Josephus置换
while length(sixth) > 1
    % 将第一个元素移动到数组末尾
    sixth = [sixth(2:end); sixth(1)];
    % 丢弃现在的第一个元素(原来的第二个元素)
    sixth(1) = []
end
half2 = sixth

%% 见证奇迹!
if half1 == half2
    disp('魔法祈福仪式成功啦,2024一整年幸福快乐地度过每一天!')
else
    disp('春晚重播啦!')
end

第一次写csdn上的博客

你可能感兴趣的:(数学建模,matlab)