微信红包算法 - OC

知乎-微信红包算法

  • 一个简单的分配算法:
    • 随机分配n次
    • 把每次分配的部分减去,在进行随机分配
    • 分配过程中,考虑好,分配为0的情况
  • 实现方式1
- (void)weChatRedEnvelopeWithTotalMoney:(CGFloat)totalMoney totalPeople:(NSInteger)totalPeople minMoney:(CGFloat)minMoney{
    
    totalMoney = 100; // 红包总金额
    totalPeople = 3; // 抢红包总人数
    minMoney = 0.01; // 每个人最少能收到0.01元
    
    for (int i = 1; i < totalPeople; i++) {
        
        // 剩下几个人
        NSInteger remainPeopleNum = totalPeople - (i - 1);
        
        // 红包额度峰值
        CGFloat topMoney = totalMoney - minMoney * remainPeopleNum;
        
        // 获取随机金额
        CGFloat rNum = (arc4random_uniform(100) + 1) / 100.0;
        NSLog(@"随机数:%.2f",rNum);
        CGFloat individualMoney = rNum * topMoney + minMoney;
        
        totalMoney = totalMoney - individualMoney;
        
        NSLog(@"第 %zd 个红包: %.2f 元,剩下:%.2f 元\n", i, individualMoney,
              totalMoney);
    }
    NSLog(@"第 %zd 个红包: %.2f 元,剩下:0 元\n", totalPeople,totalMoney);
    
}
思路分析
  • 问题的引发:怎么让一伙人随机分钱

    • 第一种方式,感觉咋都不均匀,前几个人分钱的基数更大,所有他们获得跟多的钱的可能性更大。
  • 如何更均匀的分钱

    • 通过设置一个红包峰值,在每个人的平均幅度中上下跳动
    • 为何是2倍的平均数:简而言之,让这场游戏,有刺激,有波动,但不至于太波动。可以通过统计分析获得比较。
  • 实现方式2

- (void)weChatRedEnvelopeWithTotalMoney:(CGFloat)totalMoney totalPeople:(NSInteger)totalPeople minMoney:(CGFloat)minMoney{
    
     totalMoney = 100; // 红包总金额
     totalPeople = 3; // 抢红包总人数
     minMoney = 0.01; // 每个人最少能收到0.01元
    
    for (int i = 1; i < totalPeople; i++) {
        
        // 剩下几个人
        NSInteger remainPeopleNum = totalPeople - (i - 1);
        
        // 平均每个人多少钱
        CGFloat averageMoney = (totalMoney - (remainPeopleNum) * minMoney) / (remainPeopleNum);
        
        // 红包额度峰值
        CGFloat topMoney = averageMoney * 2; // 关于为什么是2,因为剩下两个人分钱
        
        // 获取随机金额
        CGFloat rNum = (arc4random_uniform(100) + 1) / 100.0;
        NSLog(@"随机数:%.2f",rNum);
        CGFloat individualMoney = rNum * topMoney + minMoney;
        
        totalMoney = totalMoney - individualMoney;
        
        NSLog(@"第 %zd 个红包: %.2f 元,剩下:%.2f 元\n", i, individualMoney,
              totalMoney);
    }
    NSLog(@"第 %zd 个红包: %.2f 元,剩下:0 元\n", totalPeople,totalMoney);
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我爸妈十八岁的时候在日语中专相识,据说我爸当时帅到完全不压于肖奈,那时候的爷爷家也是富到甩开普通家庭好几条街。姥爷...
    梦露酱酱阅读 507评论 0 2
  • 在学习了 简单robot打包后知道了把远程代码仓库的地址填输到对应的仓库代码地址,添加corpCode、代码分支名...
    __Seven阅读 154评论 0 0