|
问题:
1~m个不同的数,从中有放回重复抽取n次,问:在抽取的n次结果中,有多少组数是出现x次的?例如从一个数1中抽5次,则有1组数出现了5次。
问题来源:
m个士兵与n个士兵混战,独立各自锁敌,血攻比为x,求一回合能击杀多少人?
相关matlab模拟分享:
- model_m=[300,50];
- model_n=[100,50];%模型【血量,攻击】
- m=5340;%m人数
- n=10000;%n人数
- t=clock;
- M=[[1:m]',repmat(model_m,m,1),randi(n,m,1)];%id 血量 攻击 锁敌目标id
- N=[[1:n]',repmat(model_n,n,1),randi(m,n,1)];%id 血量 攻击 锁敌目标id
- x=0;
- while sum(M(:,2))>0&&sum(N(:,2))>0
- N(unique(M(:,4)),2)=N(unique(M(:,4)),2)-histc(M(:,4),unique(M(:,4)))*model_m(2);%m攻击n
- M(unique(N(:,4)),2)=M(unique(N(:,4)),2)-histc(N(:,4),unique(N(:,4)))*model_n(2);%n攻击m
- live_n=N(:,2)>0;
- live_m=M(:,2)>0;
- suodi_m=ismember(M(:,4),N(live_n,1));
- suodi_n=ismember(N(:,4),M(live_m,1));
- l_n=cumsum(~live_n);%n的累积战败数量
- l_m=cumsum(~live_m);
- M(live_m&suodi_m,4)=M(live_m&suodi_m,4)-l_n(M(live_m&suodi_m,4));
- N(live_n&suodi_n,4)=N(live_n&suodi_n,4)-l_m(N(live_n&suodi_n,4));
- if sum(live_m&~suodi_m)>0&&sum(live_n)>0
- M(live_m&~suodi_m,4)=randi(sum(live_n),sum(live_m&~suodi_m),1);%目标战败重新锁敌
- end
- if sum(live_n&~suodi_n)>0&&sum(live_m)>0
- N(live_n&~suodi_n,4)=randi(sum(live_m),sum(live_n&~suodi_n),1);%目标战败重新锁敌
- end
- M=M(live_m,:);%清除战败单位
- N=N(live_n,:);%清除战败单位
- x=x+1;
- end
- Mshengyu=size(M,1)
- Nshengyu=size(N,1)
- clock-t
- x
复制代码
|
|