基于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