微信紅包算法 - OC

知乎-微信紅包算法

  • 一個簡單的分配算法:
    • 隨機分配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);
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我爸媽十八歲的時候在日語中專相識,據(jù)說我爸當時帥到完全不壓于肖奈,那時候的爺爺家也是富到甩開普通家庭好幾條街。姥爺...
    夢露醬醬閱讀 546評論 0 2
  • 在學(xué)習了 簡單robot打包后知道了把遠程代碼倉庫的地址填輸?shù)綄?yīng)的倉庫代碼地址,添加corpCode、代碼分支名...
    __Seven閱讀 165評論 0 0

友情鏈接更多精彩內(nèi)容