• 用统计模拟的方法分析微信抢红包


    本文在Creative Commons许可证下发布

    思路如下:

    首先需要设定一个红包金额分配机制。这里使用一个简化模型,即假设抢到红包的人分得的金额占总金额的比例(每个人对应一个比例,在这里设定为向量,且其总和为1)服从Dirichlet分布,参数为(α,α,…, α),α决定红包发放的“公平”程度,α越大,每人分得的金额比例就越倾向于平均,反之,波动性越大。好,下面是模拟程序:

    设定红包接力100次,计算大家最后手上的余额。

    library("gtools", lib.loc="D:/Program Files/R/R-3.3.1/library")
    
    param=list(group_size=50,##群的人数
    
               init_balance=50,##每人初始金额
    
               hb_amount=20,##每次红包总金额
    
               hb_size=10,##每次红包发多少人
    
               niter=100,##红包接力次数
    
               alpha=2##红包金额分配参数
    
               )
    
               hb_experiment=function(p)
    
               {
    
                 id=1:p$group_size #分配群成员ID编号
    
                 balance=rep(p$init_balance,p$group_size)#当前每人资产
    
                 bal=matrix(0,p$niter,p$group_size)
    
                 for(i in 1:p$niter)
    
                 {
    
                   #破产就别玩了
    
                   players=id[balance>0]
    
                   if(i == 1)
    
                   {
    
                     #第一轮随机挑人发红包
    
                     host=sample(players,1)
    
                   }else{
    
                     #后面就找抢的最多的
    
                     host=winners[which.max(winner_amount)]
    
                   }
    
                   #红包主掏钱
    
                   balance[host]=balance[host]-p$hb_amount
    
                   #手快有,手慢无
    
                   winners=sample(players,p$hb_size)
    
                   #每人领取的红包金额
    
                   winner_amount=p$hb_amount*c(rdirichlet(1,rep(p$alpha,p$hb_size)))
    
                   balance[winners]=balance[winners]+winner_amount
    
                   bal[i, ]=balance
    
                 }
    
                 return(list(balance=bal,last_balance=balance))
    
               }
    
               set.seed(123)
    
              
    
               hb_experiment(param)$last_balance
    

      

               计算结果如下:

    [1]  31.244667  82.693345  18.072119  44.561940  62.869733  33.399248  47.003107  45.550620

     [9]  77.108569  70.435722  54.282843  26.981727  54.743774  80.302944  28.315862  43.980291

    [17]  48.801944  82.694191  82.937560 -10.998868  34.301398  80.640606  60.678044  47.335579

    [25]  40.126604  52.545811  23.386063  62.666160  92.201977  72.426845  41.550410  40.116285

    [33]  50.507903  81.295672  51.165890  43.360551  34.928390  64.378636  42.700558  -8.903608

    [41]   9.101540  78.605832  46.349353  64.175663  61.900195  13.606066  50.006777  68.509099

    [49]  41.213098  54.141264

     最后可以看出破产的玩家都是因为中头奖中的太多,导致入不敷出;相反,大赢家则是闷声发财这种。经统计,他获得第二名3次,第三名2次,第四名2次,第五名4次,等等。

    -----------做计算机网络架构和量化投资理论的高效学习产出者
  • 相关阅读:
    Tomcat中实现IP访问限制
    webservice ssl双向认证配置
    如何更专业的使用Chrome开发者工具
    C++中常量成员函数的含义
    写时拷贝COW(copy-on-write)
    char* 、const char*和string之间的转换
    C++模板特化与偏特化
    lamda表达式和尾置返回类型
    编译期多态和运行时多态
    静态绑定和动态绑定
  • 原文地址:https://www.cnblogs.com/evilqliang/p/6141112.html
Copyright © 2020-2023  润新知