大年初一退役数学建模er究竟在干啥呢,昨晚看刘谦魔术不舍得撕坏一副好牌,毕竟当时还在打呢
但是我可以用代码模拟啊
看着网上各路大神什么Josephus环啊,线代啊,甚至还有高考数列题(大学生看得津津有味嗷)……各显神通,现在我就用MATLAB实现这样一个过程(完整代码直接放在最后,可能有可以优化的地方,但是毕竟大年初一拜年要紧,大家评论区直接改就行)
首先准备牌嘛,那就好了
第一步,撕牌!
第二步,按照名字个数换底,按小尼老师为例,nName = 7;
第三步,前三张随便乱插
然后把第一个一半藏到屁股底下(bushi
第四步,按南北方随便乱插
第五步,男生丢掉1张,女生丢掉2张,这里用的randi(2),这次运行是女生诶
第六步,大声喊出“见证奇迹的时刻”!连换7次
第七步,好运留下来,烦恼丢出去!
这样就有了另一半:
也祝大家幸福快乐地度过每一天!
附上代码:
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)
%% 前三张插入在第insertPos张后
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上的博客