昨天星苏直播开炉石卡包,并发起对应的竞猜,竞猜内容大致是: 50包卡包中,出现橙卡数目的奇偶性。 然后就有弹幕说:“哎呀,猜单双多没意思呀,可能性一样,赔率不会悬殊,没意思。” 那么,奇偶出现的可能性是一样吗?
模型建立
暴雪爸爸前段时间发布了关于《炉石传说》卡牌包抽取概率公告,其中有两条关键信息:
平均20个炉石卡牌包,可获得一张传说品质卡牌。
此外,需要说明的是:随着卡牌包抽取数量的增多,玩家实际获得高品质卡牌的概率也将同步提高。
通过官方的说明,加上对开包已有的认知,可以将 卡牌包抽取 行为近似抽象为 伯努利试验(或 重复独立试验)。由于卡牌包抽取数量的增大,获得传说(橙卡)的概率也会相应提高,也就是前面的试验结果会对后续的试验结果产生一定影响,故而这里的 伯努利试验 模型并不十分精确。但在开包数目相对较小的情况下,我们还是可以使用 伯努利试验 进行近似建模抽象的。毕竟,官方没有透露任何关于卡牌包出传说概率模型的消息,也只能用 伯努利试验 对其进行简单抽象了。
另外,这里也可以得知,单包出橙卡的概率为 1/20 即 0.05。
在 n 次重复独立试验中,用 ξ 表示事件A发生的次数,用 p 表示事件A在单次试验中发生的概率,则事件A发生 k 次的概率 P 为:
建立了数学模型,可以方便解决问题了。\(≧▽≦)/
编码实现
/**
* 重复独立试验
* @author Tianma
*
*/
public class BernoulliExperiment {
/**
* 重复独立试验(伯努利试验),单次出现概率为p(0<p<1)的情况下,重复独立试验n次,返回命中k次的概率
* <p>
* P(k,n,p) = C(n,k)*(p^k)*((1-p)^(n-k)),其中(k = 0,1,2,...,n)
*/
public double probability(int n, int k, double p) {
return combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);
}
/**
* 计算C(n,m)组合数的值
*/
public long combination(int n, int m) {
long[] arr = new long[m + 1];
for (int i = 0; i < arr.length; i++) {
arr[i] = 1;
}
for (int i = 1; i <= n - m; i++) {
for (int j = 1; j <= m; j++) {
arr[j] += arr[j - 1];
}
}
return arr[m];
}
public static void main(String[] args) {
BernoulliExperiment bernoulli = new BernoulliExperiment();
double p = 0.05;
int n = 50;
double oddProbability = 0, evenProbability = 0;
for (int i = 0; i <= n; i++) {
double probability = bernoulli.probability(n, i, p);
if (i % 2 == 0) {
evenProbability += probability;
} else {
oddProbability += probability;
}
}
System.out.println("Odd probability : " + oddProbability);
System.out.println("Even probability : " + evenProbability);
System.out.println("Odd + Even : " + (evenProbability + oddProbability));
}
}
上述代码中涉及到组合数的计算,详情可以看之前的博客 组合数的计算。
运行结果如下:
Odd probability : 0.497423112396339
Even probability : 0.502576887603659
Odd + Even : 0.999999999999998
从运行结果我们可以看出,50个卡包开出橙卡数目的奇偶性的概率大致一样,但还是有略微差别。如果对 n 和 p 取不同的值,得到的奇偶性概率差又会不一致。也就是说,需要经过一定的计算才能判断最终结论走向。
最后的最后,想说一句,芝士就是力量(大雾) ╰( ̄▽ ̄)╮