- 一个简单的分配算法:
- 随机分配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);
}