【MATLAB】一种偶然性更小的抽奖代码

21 篇文章 3 订阅

【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:num
    resstr{n} = num2str(res(n));
end
text((1:num)-0.5,double(res)+500,resstr)

% 添加你的颁奖规则
%

其他

  1. bilibili搜“今天不飞了”了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值