美文网首页
炉石开包引发的血案(雾

炉石开包引发的血案(雾

作者: tianma | 来源:发表于2018-02-06 22:49 被阅读23次

    原文地址: http://tianma.space/post/1310087385/

    昨天星苏直播开炉石卡包,并发起对应的竞猜,竞猜内容大致是: 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 取不同的值,得到的奇偶性概率差又会不一致。也就是说,需要经过一定的计算才能判断最终结论走向。

    最后的最后,想说一句,芝士就是力量(大雾) ╰( ̄▽ ̄)╮

    相关文章

      网友评论

          本文标题:炉石开包引发的血案(雾

          本文链接:https://www.haomeiwen.com/subject/zkvnzxtx.html