偶然性更小的抽奖代码"/>
【MATLAB】一种偶然性更小的抽奖代码
【MATLAB】一种偶然性更小的抽奖代码
- 原理
- 代码
- 其他
由于突发事件,需要进行“抽奖”。大家都怕中奖,所以让我搞一个更“公平”的代码来抽。
by 今天不飞了
原理
直接抽偶然性太大了,所以用“击中”策略。
把所有参与者“绑在靶子上”,随机射击N枪,统计每人“中弹数”,并进行排序。
后续就可以排序颁奖,如:
最高的一等奖,后两个二等奖,接着三个三等奖……
代码
clear; close all; clc% 提供你的成员表(可以改成名字或编号等等)
list = {'A','B','C','D','E'};% --------------------------------------
% 开始
num = length(list); % 成员数
iter = 100; % 射击单量(每多一个人,增加100发子弹),增大该数字以提高稳定性
disp(['总计',num2str(num),'人,射击',num2str(num*iter),'次'])
% 射击
A = uint8(ceil(rand(num*iter,1)*num));
B = zeros(length(A)+1,num,'int16');
% 统计
for n = 1:length(A)B(n+1,:) = B(n,:); B(n+1,A(n)) = B(n+1,A(n))+1;
end
% 显示过程
subplot(211)
for n = 1:ceil(iter/100):length(A)bar(B(n,:))axis([0,num+1,0,iter*1.5])xticks(1:num)xticklabels(list)ylabel('\fontsize{18}中枪')drawnow
end
% 排序
[res,idx] = sort(B(end,:),'descend');
list = list(idx);
% 显示排序
subplot(212)
bar(res)
axis([0,num+1,0,iter*1.1])
xticks(1:num)
xticklabels(list)
ylabel('\fontsize{18}中枪')
resstr = cell(num);
for n = 1:numresstr{n} = num2str(res(n));
end
text((1:num)-0.5,double(res)+500,resstr)% 添加你的颁奖规则
% 略
其他
- bilibili搜“今天不飞了”了
更多推荐
【MATLAB】一种偶然性更小的抽奖代码
发布评论