微信发红包算法探究

微信发红包,也就是把一个数随机分成n份,n份数额的的值等于总数额。
依据以上规则。实现如下
1.有最小值 其它随机分配
代码实现如下:

- (NSMutableArray *)getRedFromJavaWithTotalMoney:(CGFloat)total redNumber:(NSInteger)number minMoney:(CGFloat)min
{

 if(total/number<min)
    {
        NSLog(@"最小值不合法");
        
        return nil;
    }

    float money;
    double max;
    int i=1;
    
    NSMutableArray *math = [NSMutableArray array];
    while(i<number)
    {
        
        max = total- min*(number- i);
        NSInteger k = (int)((number-i)/2);
        if (number -i <= 2)
        {
            k = number -i;
            
        }
        max = max/k;
        double val = ((double)arc4random() / 0x100000000);
       if (max<min)
         {
            NSLog(@"max小于min");
            max = min+1;
         }
        money=(int)(min*100+val*(max*100-min*100+1));
        money=(float)money/100;
        total=total-money;
        ;
        [math addObject:[NSString stringWithFormat:@"%f",money]];
//        NSLog(@"第%d人 拿到%f",i,money);
        i++;
        if(i==number)
        {
            [math addObject:[NSString stringWithFormat:@"%f",total]];
//            NSLog(@"最后 第%d人 拿到%f",i,money);
        }
    }
    

    return math;
    
}

2.有最小值和最大值
代码实现如下

- (NSMutableArray *)getRedFromJavaWithTotalMoney:(CGFloat)total redNumber:(NSInteger)number minMoney:(CGFloat)min maxMoney:(CGFloat)maxMoney
{
    if (total/number>maxMoney)
    {
        NSLog(@"最大值不合法");
        
        return nil;
    }
    if(total/number<min)
    {
        NSLog(@"最小值不合法");
        
        return nil;
    }
    
    float money;
    double max;
    int i=1;
    
    NSMutableArray *math = [NSMutableArray array];
    while(i<number)
    {
        
        max = total- min*(number- i);
        CGFloat canMaxMoney = maxMoney>max?max:maxMoney;
        NSInteger k = (int)((number-i)/2);
        if (number -i <= 2)
        {
            k = number -i;

        }
        max = max/k;
        
        double val = ((double)arc4random() / 0x100000000);
        if (max<min)
        {
            NSLog(@"max小于min");
            max = min+1;
        }
        money=(int)(min*100+val*(canMaxMoney*100-min*100+1));
        money=(float)money/100;
        total=total-money;
        [math addObject:[NSString stringWithFormat:@"%f",money]];
        //        NSLog(@"第%d人 拿到%f",i,money);
        i++;
        if(i==number)
        {
            [math addObject:[NSString stringWithFormat:@"%f",total]];
            //            NSLog(@"最后 第%d人 拿到%f",i,money);
        }
    }
    
    return math;
    
}

好好学习 天天向上
不足之处 欢迎指出

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 不断更新,有身体的,智力的,精神的等等,不论哪一种都是为了让自己更强,更优秀。 文中说到习惯是一种必须花费时间训练...
    胡钧阅读 189评论 0 0
  • 我理解的手账无非就是记录一天内发生的事情及对此产生的想法。开心的伤感的,全部都可以画下来,加上文字的描述,就可以完...
    一只天蝎座小仙女阅读 614评论 0 3
  • 当我们在声明属性时,不要以new开头。如果非要以new开头命名属性的名字,需要自己定制get方法名。且往下看~ @...
    GameTang阅读 566评论 3 1
  • 前几天有一个朋友问我如何找到淘宝商家内部的优惠券,这样茫然的去找也是挺麻烦的,我告诉他我直接下载一个白菜优惠券ap...
    菜菜ava阅读 504评论 0 0
  • 终于忙碌已经告一段落,回家。
    微_风起阅读 137评论 0 0