基于matlab的克苏恩和奴隶主的打脸概率计算
小伙伴发给我这么一道题
然后就想顺手写写
还挺好玩。
我的解法是暴力跑一下,
跑的真的是慢
好想要一个GTX1080,

一、第一问!!!
main.m
dead=0; %死亡次数初始化
for i=1:1:10000 %跑10000次
a = zeros(1,7); %场面上七个随从的位置,里面存的是血量
a(1)=3; %一个奴隶主
num=1;
man=10;
for j=1:1:20 %20点伤害
[a num]=kk(a); %把数组非零的排到前面
hit=randint(1,1,[1,num+1]) %随机伤害
if hit==num+1
man=man-1;
else
a=kk2(a,num,hit); %伤害之后判断要不要分裂,返回血量数组
end
if man==0%死了
dead=dead+1;%死透了
break;%死的不能再死了,跳出,减少计算量。
end
end
end
kk.m
function [a re] = kk( a ) %KK Summary of this function goes here % 把数组得非零项放在数组的前方
% 便于处理
% re是返回有多少个随从
for z=1:1:5 for i=1:1:6 if a(i)==0 for j=i:1:6 a(j)=a(j+1); end a(7)=0; end end end count=0; for i=1:1:7 if a(i)~=0 count=count+1; end re=count; end
kk2.m
function [ a ] = kk2( a,num,dem ) %KK2 Summary of this function goes here % 判断奴隶主受到伤害之后要不要分裂
% 同时判断该奴隶主是不是会死亡
% 返回血量数组
if a(dem)>1 if num<7 a(dem)=a(dem)-1; for i=1:1:6 if a(i)==0 a(i)=3; break; end end num=num+1; else a(dem)=a(dem)-1; end else a(dem)=a(dem)-1; [a num]=kk(a); end end

二、第二问!!!
首先我是不愿意写出解析式的
然后我们暴力跑吧
就是这么任性
Talk is easy,show you the code!!!!
main.m
b = zeros(1,21);
for i=1:1:10000
a = zeros(1,7);
a(1)=3;
num=1;
man_hit=0;
for j=1:1:20
[a num]=kk(a);
hit=randint(1,1,[1,num+1])
if hit==num+1
man_hit=man_hit+1;
else
a=kk2(a,num,hit);
end
end
b(man_hit+1)=b(man_hit+1)+1;
end
kk.m
function [a re] = kk( a )
%KK Summary of this function goes here
% Detailed explanation goes here
for z=1:1:5
for i=1:1:6
if a(i)==0
for j=i:1:6
a(j)=a(j+1);
end
a(7)=0;
end
end
end
count=0;
for i=1:1:7
if a(i)~=0
count=count+1;
end
re=count;
end
kk2.m
function [ a ] = kk2( a,num,dem )
%KK2 Summary of this function goes here
% Detailed explanation goes here
if a(dem)>1
if num<7
a(dem)=a(dem)-1;
for i=1:1:6
if a(i)==0
a(i)=3;
break;
end
end
num=num+1;
else
a(dem)=a(dem)-1;
end
else
a(dem)=a(dem)-1;
[a num]=kk(a);
end
end

当然这个数据是归一化之后的了
就是/10000;
最后plot一下

虽然说应该是离散的
但是不要要求这么高嘛
大家玩得开心就好
技术拯救世界哈哈
三、!!!!
有空来写第三题了
main.m
b = zeros(1,50);
for z=1:1:50
dead=0; %死亡次数初始化
for i=1:1:10000 %跑10000次
a = zeros(1,50); %场面上50个随从的位置,里面存的是血量
a(1)=3; %一个奴隶主
num=1;
man=10;
for j=1:1:z %z点伤害
[a num]=kk(a); %把数组非零的排到前面
hit=randint(1,1,[1,num+1]); %随机伤害
if hit==num+1
man=man-1;
else
a=kk2(a,num,hit); %伤害之后判断要不要分裂,返回血量数组
end
if man==0%死了
dead=dead+1;%死透了
break;%死的不能再死了,跳出,减少计算量。
end
end
end
b(z)=dead;
end
kk.m
function [a re] = kk( a )
%KK Summary of this function goes here
% 把数组得非零项放在数组的前方<br>% 便于处理<br>% re是返回有多少个随从<br>
for z=1:1:48
for i=1:1:49
if a(i)==0
for j=i:1:49
a(j)=a(j+1);
end
a(50)=0;
end
end
end
count=0;
for i=1:1:50
if a(i)~=0
count=count+1;
end
re=count;
end
kk2.m
function [ a ] = kk2( a,num,dem )
%KK2 Summary of this function goes here
% 判断奴隶主受到伤害之后要不要分裂<br>% 同时判断该奴隶主是不是会死亡<br>% 返回血量数组<br>
if a(dem)>1
if num<50
a(dem)=a(dem)-1;
for i=1:1:49
if a(i)==0
a(i)=3;
break;
end
end
num=num+1;
else
a(dem)=a(dem)-1;
end
else
a(dem)=a(dem)-1;
[a num]=kk(a);
end
end
我估计我的电脑要跑三天,
所以谁有空帮忙跑一下。
我只做了1-50点伤害的,
你们把Z改大可以任意大
我初步跑了一下
我认为在50以内。
但数据少并不确定位置
不想做机器学习的硬件工程师不是好的CCIE
浙公网安备 33010602011771号