C# 实现拼手气红包算法整理

一、方案1:即开即中,考虑机会均等,减少金额差较大的几率

可以每次点击时候,随机产生

    static double[] GetRandomMoney(double money, int n)
    {
        double[] array = new double[n];
        RedPackage red = new RedPackage() { money = money, count = n };
        for (int i = 0; i < n; i++)
        {
            array[i] = GetRandomMoney(red);
        }
        return array;
    }
    /// 
    /// 即开即中,考虑机会均等,减少金额差较大的几率
    /// 随机产生,额度在0.01和剩余平均值*2之间
    /// 
    /// 
    static double GetRandomMoney(RedPackage redPackage)
    {
        //如果最后一个,返回全部
        if (redPackage.count == 1)
        {
            redPackage.count--;
            return Math.Round(redPackage.money * 100) / 100.00;
        }
        //随机生成
        Random ran = new Random();
        double min = 0.01;
        double max = redPackage.money / redPackage.count * 2;
        double money = ran.NextDouble() * max;

        money = money <= min ? 0.01 : money;
        money = Convert.ToInt32(money * 100) / 100.00;
        redPackage.count--;
        redPackage.money -= money;
        return money;
    }
    public class RedPackage
    {
        /// 
        /// 剩余红包数量
        /// 
        public int count;
        /// 
        /// 剩余金额
        /// 
        public double money;
    }

生成5组随机结果如下:

总金额:10.0元  红包个数5
2.71元    2.6元    0.36元    3.52元    0.81元
总计:10

总金额:10.0元  红包个数5
1.2元    4.12元    2.15元    1.38元    1.15元
总计:10

总金额:10.0元  红包个数5
0.88元    1.28元    1.65元    3.84元    2.35元
总计:10

总金额:10.0元  红包个数5
0.53元    2.1元    2.76元    0.94元    3.67元
总计:10

总金额:10.0元  红包个数5
2.71元    1.48元    0.15元    3.68元    1.98元
总计:10
 

二、方案2: 一次性拆分红包,不考虑机会平等性

    /// 
    /// 一次性拆分红包,不考虑机会平等性
    /// 最小单位1 分
    /// 
    static double[] DiviedOne(double money, int n)
    {

        double min = 0.01;
        if (money < min)
            throw new Exception("拆分金额不能小于0.01 ");
        int fen = (int)money * 100;
        //创建n 个红包数组
        int[] array = new int[n];
        //每个红包先填充1分
        Array.Fill(array, 1);
        fen -= n;

        //第二步,随机分配
        Random ran = new Random();
        int i = 0;
        while (fen > 1)
        {
            int f = ran.Next(fen);
            array[i % n] += f;
            fen -= f;
            i++;
        }
        //最后一分钱,补到第一个数组
        if (fen > 0)
        {
            array[0] += fen;
        }

        return array.Select(q => q / 100.0).ToArray();
    }

生成5组随机结果如下:

总金额:10.0元  红包个数5
4.85元    2.59元    0.72元    1.52元    0.32元
总计:10

总金额:10.0元  红包个数5
2.3元    6.18元    1.32元    0.16元    0.04元
总计:10

总金额:10.0元  红包个数5
8.66元    0.12元    1.04元    0.16元    0.02元
总计:10

总金额:10.0元  红包个数5
6.33元    0.65元    2.01元    0.75元    0.26元
总计:10

总金额:10.0元  红包个数5
1.77元    5.21元    0.86元    2.1元    0.06元
总计:10

 

 

你可能感兴趣的:(设计模式,C#,实现拼手气红包算法整理)