.NET C# 红包生成算法,可设置红包总额和数量,可限制最大最小红包
原理:割绳子算法:每次都取最大值为总绳长的随机值,最后将其排序,计算每两个的差值,总差值即就是总绳子长度,但是割绳子算法算出来的金额可能会出现超出最大金额的值,那么就会需要使用平均算法。
平均算法(自己取的名字):将超过最大限定金额的值全部重新赋值,并将他们舍去的部分,随机分给最小的金额,并保证最小的金额加上一个值不超过最大值即可。
洗牌算法:最终要将排序的金额进行打乱。
开源是程序员的基本美德
int pp = 100;//元换算成分的比例int total =(int)((decimal)10 * pp);//红包总额 int num = 8;//红包个数int min = (int)((decimal)0.02 * pp);//红包不少于int max = (int)((decimal)2 * pp);//最大红包不超过 if (min <= 0 && min >= (total - max) / (num - 1)){Console.WriteLine($"红包最小值异常:{total}分{num}个红包,最小值必须大于0,且不能小余{(total - max) / (num - 1)/100f}");return;}if (num * min > total){Console.WriteLine($"红包最小值异常:{total}分{num}个红包,红包最小值不能超过{total / num / 100f}");return;}if (num * max < total){Console.WriteLine($"红包最大值异常:{total}分{num}个红包,红包最大值不能小余{total / num / 100f}");return;}if (max > total - min * (num - 1)){Console.WriteLine($"红包最大值异常:{total}分{num}个红包,红包最大值不能超过{(total - min * (num - 1)) / 100f}");return;}float[] ret = new float[num];ret[0] = 0;int i = 1;//下面不考虑随机数的唯一性,给每个人都预留最少的钱int totalByHundred = total - (num * min);Random random = new Random();while (i < num){ret[i] = random.Next(totalByHundred);i++;}//先从大到小排序 将差值计算出来+最先预留的min值Array.Sort(ret);i = 0;while (i < num - 1){ret[i] = (ret[i + 1] - ret[i] + min);//每个人都预留最少的钱i++;}ret[i] = (totalByHundred - ret[i] + min);//最后一个 仍然是最大可分值-自身+min值即可。//再次排序金额 将超出最大值的金额 全部重新赋值,并将差值累加给tempmax ,然后将tempmax再依次随机分给最小的金额Array.Sort(ret);float tempmax = 0;for (int k = ret.Length - 1; k >= 0; k--){if (ret[k] > max){float t = random.Next(min,max);tempmax += ret[k] - t;ret[k] = t;}else{break;}}//分完为止 可能运气好 没有可分的 while (tempmax > 0){Console.WriteLine("触发平均算法执行");Array.Sort(ret);for (int k = 0; k < ret.Length; k++){//一轮分不完 将再次排序再分 tempmax为0即可if (tempmax > 0){int tm = max - (int)ret[k];if (tempmax< tm){//此处判断非常重要 ret[k] = ret[k] + tempmax;tempmax = 0;}else{float t = random.Next(tm);ret[k] = ret[k] + t;tempmax -= t;}}else{break;}}}//最后利用洗牌算法进行打乱数组int currentIndex;float tempValue;for (int j = 0; j < ret.Length; j++){currentIndex = random.Next(0, ret.Length - j);tempValue = ret[currentIndex];ret[currentIndex] = ret[ret.Length -1- j];ret[ret.Length-1 - j] = tempValue;}//完美for (int j = 0; j < ret.Length; j++){Console.WriteLine($"第{j + 1}个红包:金额{(ret[j] / 100f)}元");}//最后检查总红包金额以及最大最小红包是否符合要求 肯定符合要求的 只是输出看一下Console.WriteLine($"红包总金额:{(ret.Sum() / 100f).ToString("F2")}元,红包最大值:{ret.Max() / 100f}元,红包最小值:{ret.Min() / 100f}元");
该算法由C#写成,更多交流请关注原文博客地址:
红包算法的一种
.NET C# 红包生成算法,可设置红包总额和数量,可限制最大最小红包相关推荐
- php 红包生成算没法,红包生成算法的需求(PHP版本)
预先生成所有的红包还是一个请求随机生成一个红包,这个红包的最大和最小值都可以钱数,而且是最大红包的数量也可以控制个数! 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分 ...
- java自动红包_Java一个简单的红包生成算法
一个简单的红包生成算法,代码如下: /** * 红包 * @param n * @param money 单位:分 * @return **/ public static double[] redPa ...
- 抢红包的红包生成算法
过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位 ...
- java抢红包算法_Java抢红包的红包生成算法
马上过年了.过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以&quo ...
- 微信红包随机生成算法(PHP版)
最近在研究发红包的功能,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分 ...
- 把数字随机分成 php,php随机数 微信随机生成红包金额算法php版
最近在研究发红包的功能,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分 ...
- 微信手气红包算法 php,微信随机生成红包金额算法php版
最近在研究发红包的功能,于是写了个红包的生成算法. 红包生成算法的需求预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分解 ...
- java 随机金额_java_微信随机生成红包金额算法java版,最近几年玩得最疯狂的应该是 - phpStudy...
微信随机生成红包金额算法java版 最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发. public cl ...
- 随机红包 java_微信随机生成红包金额算法java版
最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发. public class WxAlgorithm{ / ...
最新文章
- node.js 多异步之间的协作方案
- express+mongodb+vue实现增删改查-全栈之路2.0
- c语言fread malloc,流操作之读写(fread、fwrite、fopen、malloc)
- JAVA轻量级ORM框架JOOQ体验
- 示例1---从记事本中读取数值,然后写到数组中---切片,优化版本
- Hyperledger Fabric教程(14)--byfn.sh所有命令
- Axure RP 9基础教程(1)——界面及基本操作(看完就会画)
- chrome浏览器 json插件【WEB前端助手】
- STM32与ST-Link杜邦线连接
- 如何使用 区号查询API
- 2.5 第九讲 一阶微分方程的计算
- WPF中资源字典(ResourceDictionary)的使用
- Leetcode799. 香槟塔
- win10九月十五更新补丁导致共享打印机无法连接
- 跑步用app轨迹画得比较准确的居然是“咕咚”
- mac 文件上传服务器
- ArcGIS基于C#.NET的二次开发
- 黑马程序员————GUI(day22)
- smm整合first
- 阿里云ECS服务器可以干嘛,企业和个人改如何选择服务器?