专业编程基础技术教程

网站首页 > 基础教程 正文

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

ccvgpt 2024-10-12 13:37:42 基础教程 7 ℃

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

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

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

    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;    }    /// <summary>    /// 即开即中,考虑机会均等,减少金额差较大的几率    /// 随机产生,额度在0.01和剩余平均值*2之间    /// </summary>    /// <returns></returns>    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    {        /// <summary>        /// 剩余红包数量        /// </summary>        public int count;        /// <summary>        /// 剩余金额        /// </summary>        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: 一次性拆分红包,不考虑机会平等性

    /// <summary>    /// 一次性拆分红包,不考虑机会平等性    /// 最小单位1 分    /// </summary>    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

Tags:

最近发表
标签列表