今天下午看到吧里有人在讨论新赛季抽奖的概率问题,晚上自习的时候想了想,发现很难直接计算,因为这个保底机制的存在,不好说怎么算期望,还是通过模拟简单一点。
问题:
一、聚宝阁常驻锦鳞宝囊上线
售价240金块,开启即有机会获得宁红夜神品时装【赤皓新囍】、胡为神品时装【监兵凶神】、斩马刀神品皮肤【飞将戟】、火炮神品皮肤【天罚】等奖励。
保底机制:
在基础概率的基础上,前100次开启,至少会获得一件红色(神品)品质的奖励,此保底不可重复触发。在获得所有红色(神品)品质奖励之前,红色(神品)奖励不会重复获得。
概率:
红色(神品):0.3%
金色(极品):3.8%
紫色(优品):24.7%
蓝色(良品):71.2%
我预计多少抽能把4个红出完?大概花费多少金块?人民币和金块的兑换比例是1:20,那么我预计要花多少钱?
matlab代码模拟:
% 配置参数
draw_cost = 240; % 单次抽奖花费
desired_reds = 4; % 目标红色(神品)奖励数量
guarantee_threshold = 100; % 保底机制触发阈值
simulations = 10000; % 模拟次数
exchange_rate = 20; % 人民币和金块的兑换比例
% 概率
prob_red = 0.003;
% 模拟抽奖过程
results = rand;%这里是产生随机数
% 初始化统计变量
total_draws = 0;
% 模拟次数循环
for j = 1:simulations
red_count = 0;
draws = 0;
cost_gold = 0;
% 抽奖循环
while red_count < desired_reds
draws = draws + 1;
% 根据概率判断抽到的奖励
draw_result = rand;
if draw_result <= prob_red
red_count = red_count + 1;
end
% 处理保底机制
if draws == 100 && red_count == 0
red_count = red_count + 1;
end
end
total_draws = total_draws + draws;
end
% 计算平均值
average_draws = total_draws/simulations;
average_cost_gold = average_draws*draw_cost;
average_cost_rmb = average_cost_gold/exchange_rate;
% 输出结果
fprintf('平均抽奖次数:%f\n', average_draws);
fprintf('平均花费金块:%f\n', average_cost_gold);
fprintf('平均花费人民币:%f\n', average_cost_rmb);

运行两次发现都是要一万三左右,普通人还是不要碰这个箱子,白嫖一个就算胜利。
当然,有可能我的代码逻辑有问题,欢迎交流。
问题:
一、聚宝阁常驻锦鳞宝囊上线
售价240金块,开启即有机会获得宁红夜神品时装【赤皓新囍】、胡为神品时装【监兵凶神】、斩马刀神品皮肤【飞将戟】、火炮神品皮肤【天罚】等奖励。
保底机制:
在基础概率的基础上,前100次开启,至少会获得一件红色(神品)品质的奖励,此保底不可重复触发。在获得所有红色(神品)品质奖励之前,红色(神品)奖励不会重复获得。
概率:
红色(神品):0.3%
金色(极品):3.8%
紫色(优品):24.7%
蓝色(良品):71.2%
我预计多少抽能把4个红出完?大概花费多少金块?人民币和金块的兑换比例是1:20,那么我预计要花多少钱?
matlab代码模拟:
% 配置参数
draw_cost = 240; % 单次抽奖花费
desired_reds = 4; % 目标红色(神品)奖励数量
guarantee_threshold = 100; % 保底机制触发阈值
simulations = 10000; % 模拟次数
exchange_rate = 20; % 人民币和金块的兑换比例
% 概率
prob_red = 0.003;
% 模拟抽奖过程
results = rand;%这里是产生随机数
% 初始化统计变量
total_draws = 0;
% 模拟次数循环
for j = 1:simulations
red_count = 0;
draws = 0;
cost_gold = 0;
% 抽奖循环
while red_count < desired_reds
draws = draws + 1;
% 根据概率判断抽到的奖励
draw_result = rand;
if draw_result <= prob_red
red_count = red_count + 1;
end
% 处理保底机制
if draws == 100 && red_count == 0
red_count = red_count + 1;
end
end
total_draws = total_draws + draws;
end
% 计算平均值
average_draws = total_draws/simulations;
average_cost_gold = average_draws*draw_cost;
average_cost_rmb = average_cost_gold/exchange_rate;
% 输出结果
fprintf('平均抽奖次数:%f\n', average_draws);
fprintf('平均花费金块:%f\n', average_cost_gold);
fprintf('平均花费人民币:%f\n', average_cost_rmb);

运行两次发现都是要一万三左右,普通人还是不要碰这个箱子,白嫖一个就算胜利。
当然,有可能我的代码逻辑有问题,欢迎交流。