固定金额和人数红包分配算法

转自:http://www.cnblogs.com/wicub/p/6096897.html

/// <summary>
        /// 生成红包数组
        /// </summary>
        /// <param name="totalMoney">总金额</param>
        /// <param name="perMax">最大金额</param>
        /// <param name="perMin">最小金额</param>
        /// <param name="totalUser">总人数</param>
        static decimal[] CalueHB(int totalMoney, decimal perMax, decimal perMin, int totalUser)
        {
            int i = 0; //第几人
            decimal[] array = new decimal[totalUser];//分配结果集
            Random ran = new Random();

            for (i = 0; i < totalUser; i++) //保证每个人有最小金额+随机值
            {
                array[i] = perMin + Math.Round((Convert.ToDecimal(ran.NextDouble()) * (totalMoney / totalUser - perMin - 1)), 2);
            }

            decimal yet = array.Sum(); // 已分配的总金额
            decimal thisM = 0M; //当前随机分配金额

            while (yet < totalMoney)
            {
                thisM = Math.Round((Convert.ToDecimal(ran.NextDouble()) * (perMax - perMin - 1)), 2);

                i = ran.Next(0, totalUser); //随机选择人
                if (yet + thisM > totalMoney)
                {
                    thisM = totalMoney - yet;
                }

                if (array[i] + thisM < perMax)//判断是否超出最大金额
                {
                    array[i] += thisM;
                    yet += thisM;
                }
            }

            Array.Sort(array);

            yet = 0;
            for (i = 0; i < totalUser; i++)
            {
                yet += array[i];
                Console.Write("第{0}人=>分配{1}元,合计分配{2}元\r\n", (i + 1).ToString().PadLeft(3, ‘ ‘), array[i].ToString("f2").PadLeft(8, ‘ ‘), yet.ToString("f2").PadLeft(8, ‘ ‘));
            }

            return array;
        }
时间: 2024-10-13 15:52:28

固定金额和人数红包分配算法的相关文章

java实现微信红包分配算法

红包算法分析 有人认为,抢红包的额度是从0.01到剩余平均值*N(N是一个系数,决定最大的红包值)之间,比如一共发了10块钱,发了10个红包:第一个人可以拿到(0.01~1*N)之间的一个红包值,当然为了确保所有人至少有1分钱拿,不能前几个人就把钱拿光了,因此需要有一个判断算法.举个例子,如果每个人都拿了自己的最大值: package 红包分配; public class test { public static void main(String[] args){ float num=10,N=

微信红包随机算法

最近看了一篇文章,讲微信红包随机算法的.感觉很不错,所以自己实现了下,并进行了简单测试. 算法 算法很简单,不是提前算好,而是抢红包时计算: 红包里的金额怎么算?为什么出现各个红包金额相差很大?答:随机,额度在0.01和剩余平均值*2之间. 实现 实现上述算法的逻辑主要是: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余的红包数量 // remainMoney 剩余的钱 if (_red

【转】微信红包随机算法初探

最近看了一篇文章,讲微信红包随机算法的.感觉很不错,所以自己实现了下,并进行了简单测试. 算法 算法很简单,不是提前算好,而是抢红包时计算: 红包里的金额怎么算?为什么出现各个红包金额相差很大?答:随机,额度在0.01和剩余平均值*2之间. 实现 实现上述算法的逻辑主要是: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余的红包数量 // remainMoney 剩余的钱 if (_red

PHP用抛物线的模型实现微信红包生成算法的程序源码

<?php /* *Author:Kermit *Time:2015-8-26 *Note:红包生成随机算法 */ header("Content-type:text/html;charset=utf-8"); date_default_timezone_set('PRC'); #红包生成的算法程序 class reward { public $rewardMoney; #红包金额.单位元 public $rewardNum; #红包数量 public $scatter; #分散

ruby案例分析:微信红包分配

今年和去年一样,央视的春晚再次被广大网友吐槽, 即便全民呼吁"六小龄童上春晚",齐天大圣仍然没有走上央视舞台.知名时评人石述思转了这样一条微博,今年的春晚导演为了大家抢红包也是拼了,连一分钟好看的节目都没安排.目前全国人民都听牌了,单吊敬业福! 稍微吐槽一下还是回到今天的主题,今天讲一个ruby实战教程--微信红包金额分配算:知乎上的一篇文章讨论的比较深入,个人觉得下面的这个分析比较靠谱. 红包领了不少,据观察红包主要有以下几个限制条件:1.所有人都能分到红包,也就是不会出现红包数值为

PHP红包生成算法

一.适用场景 红包总金额X,分配成Y个红包,每个红包随机金额. 二.生成算法 /** * 红包生成算法 * @param $money 总金额 * @param $number 红包数量 * @param $ratio 浮动系数 */ function hongbao($money,$number,$ratio = 0.5){ $res = array(); //结果数组 $min = ($money / $number) * (1 - $ratio); //最小值 $max = ($money

微信红包生成算法 (解)

/** * 微信红包生成算法 * * @param int $total 红包金额 * @param int $num 拆分数量 * @param int $min 拆分的红包最小金额数目 */function set_packet($total, $num, $min = 0.01){ for ($i = 1; $i < $num; $i++) { //随机安全上限 $safe_total = ($total-($num-$i)*$min)/($num-$i); //红包金额 $money =

随机红包生成算法-python实现

抢红包那么开心,那你知道红包随机算法是怎么样的吗? 我模拟写了一个定额随机红包生成算法,如下. 输入: 红包总额,total 份数,num 调控参数(调控红包最平均差,默认为2) 约束: 每份最少有1分钱,即0.01 份数需为正整数 红包总额 <= 份数×0.01 输出 随机红包序列,序列长度等于红包份数 运气王,即红包数额最大的一份 # -*- coding: cp936 -*- # 思路:先随机出来m个数,然后平均分成m个数字只和的份数,然后将钱平均分给m个人# import random

关于随机红包抽奖算法

场景: 生成10个随机红包, 奖池总金额10000, 最小500, 最大1000,奖池全部分配完. 分析: 第一想法简单, 直接生成500-1000之间的随机数,直接生成10个, 直接上代码 /** * * @param lst 生成的奖项列表 * @param minAmount 红包允许的最小金额 * @param maxAmount 红包允许的最大金额 * @param totalAmount 总奖池金额 * @param count 生成红包数量 */public void genera