- 一個簡單的分配算法:
- 隨機分配n次
- 把每次分配的部分減去,在進行隨機分配
- 分配過程中,考慮好,分配為0的情況
- 實現(xiàn)方式1
- (void)weChatRedEnvelopeWithTotalMoney:(CGFloat)totalMoney totalPeople:(NSInteger)totalPeople minMoney:(CGFloat)minMoney{
totalMoney = 100; // 紅包總金額
totalPeople = 3; // 搶紅包總?cè)藬?shù)
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(@"隨機數(shù):%.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);
}
思路分析
-
問題的引發(fā):怎么讓一伙人隨機分錢
- 第一種方式,感覺咋都不均勻,前幾個人分錢的基數(shù)更大,所有他們獲得跟多的錢的可能性更大。
-
如何更均勻的分錢
- 通過設(shè)置一個紅包峰值,在每個人的平均幅度中上下跳動
- 為何是2倍的平均數(shù):簡而言之,讓這場游戲,有刺激,有波動,但不至于太波動??梢酝ㄟ^統(tǒng)計分析獲得比較。
實現(xiàn)方式2
- (void)weChatRedEnvelopeWithTotalMoney:(CGFloat)totalMoney totalPeople:(NSInteger)totalPeople minMoney:(CGFloat)minMoney{
totalMoney = 100; // 紅包總金額
totalPeople = 3; // 搶紅包總?cè)藬?shù)
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; // 關(guān)于為什么是2,因為剩下兩個人分錢
// 獲取隨機金額
CGFloat rNum = (arc4random_uniform(100) + 1) / 100.0;
NSLog(@"隨機數(shù):%.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);
}