微信紅包アルゴリズム-OC

2436 ワード

知っていますか?微信紅包アルゴリズム
  • 簡単な分配アルゴリズム:
  • ランダム割り当て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  
    ", i, individualMoney, totalMoney); } NSLog(@" %zd : %.2f , :0
    ", 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  
    ", i, individualMoney, totalMoney); } NSLog(@" %zd : %.2f , :0
    ", totalPeople,totalMoney); }