基于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以内。

但数据少并不确定位置

 

posted @ 2016-06-08 13:47  MnsterLu  阅读(529)  评论(0编辑  收藏  举报