很多dd都知道,抽盒子大概率是亏(这里的亏和赚指的是盲盒爆出的礼物和花的米做比较)的,根据官方给的概率

心动盲盒官方给的概率
心动盲盒的期望是14.988,大概亏一分左右。如果只抽一个盒子,赚的概率还可以,有55.5%。那么。。如果是10个,20个,50个,100个又会是什么情况呢?假设每个盒子都是独立的(据说有保底机制,但我也不是b的内部工作人员,具体情况我也不清楚)。根据高中学过的概率学知识,结合我个人写的一个c小程序(code见附录,这段代码可以复制到任意一个c语言的环境下运行),可以得出:

不同盒子数量赚的概率
其实可以看到,当抽100个盒子时,赚的概率大概只有1/5。但是期望仍在1500左右。
如果对其中的数学知识或者程序方面有疑问的欢迎交流(关于迭代的部分,可以写成递归形式的,看起来会更简洁。。但是我懒。。就写成这种铺开的形式了)。如果想探讨不同数量的盲盒,可以修改第15行ptimes 的值(100个盒子的计算速度会比较慢,请耐心等待,50个以下的盒子速度很快的)。如果想分析中位数之类的或者说想了解一下其他盲盒的情况只要稍加改造即可。
附录:相关代码:
#include<stdio.h> #include<math.h> #include<conio.h>
double CBnum(int, int);//combinatorial number
typedef struct{ int gnum; double value[32]; double pbty[32]; }KBox;
int main(){ int k,j,i; int a0,a1,a2,a3,a4,a5,a6; int e0,e1,e2,e3,e4,e5,e6; int ptimes = 100, rest = 0; double sum, upbty, scrh, scrh1; KBox box0; box0.gnum = 7; box0.value[0] = 2233, box0.value[1] = 200, box0.value[2] = 100, box0.value[3] = 40, box0.value[4] = 16, box0.value[5] = 9, box0.value[6] = 2; box0.pbty[0] = 0.0004, box0.pbty[1] = 0.0013, box0.pbty[2] = 0.003, box0.pbty[3] = 0.045, box0.pbty[4] = 0.505, box0.pbty[5] = 0.3949, box0.pbty[6] = 0.0504; sum = 0; for(i=0;i<box0.gnum;i++){ sum+=box0.value[i]*box0.pbty[i]; } printf("%.7f\n", sum); sum = 0; upbty = 0; for(a0=0;a0<=ptimes;a0++){ e1 = ptimes-a0; printf("check\n"); for(a1=0;a1<=e1;a1++){ e2 = e1-a1; for(a2=0;a2<=e2;a2++){ e3 = e2-a2; for(a3=0;a3<=e3;a3++){ e4 = e3-a3; for(a4=0;a4<=e4;a4++){ e5 = e4-a4; for(a5=0;a5<=e5;a5++){ e6 = e5-a5; a6 = e6; scrh = pow(box0.pbty[0],a0)*pow(box0.pbty[1],a1)*pow(box0.pbty[2],a2) *pow(box0.pbty[3],a3)*pow(box0.pbty[4],a4)*pow(box0.pbty[5],a5)*pow(box0.pbty[6],a6) *CBnum(ptimes,a0)*CBnum(e1,a1)*CBnum(e2,a2)*CBnum(e3,a3) *CBnum(e4,a4)*CBnum(e5,a5); scrh1 = (a0*box0.value[0]+a1*box0.value[1]+a2*box0.value[2] +a3*box0.value[3]+a4*box0.value[4]+a5*box0.value[5]+a6*box0.value[6]); if(scrh1>15*ptimes) upbty+=scrh; sum += scrh*scrh1; }}}}}} printf("Sum:%.7f, Win probability: %.7f", sum, upbty); getch(); return 0; }
double CBnum(int d, int u){ double result = 1.0; if(u>d) return 0; if(u==0) return 1; while(1){ result=result*(double)(d--)/(double)(u--); if(u==0)break; } return result; }