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;}/// <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
C# 实现拼手气红包算法整理相关推荐
- java 红包算法_JAVA实现拼手气红包算法
实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...
- 拼手气红包算法_二倍均值法
使用二倍均值法进行的拼手气红包算法 假设M为总金额,N为抢红包人数,那么根据二倍均值法,每次抢到的金额 = 随机区间 (0, M / N X 2) 这个公式可以确保每个人获取的金额的平均值是相等的,不 ...
- 拼手气红包java_JAVA实现拼手气红包算法
实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...
- 微信拼手气红包算法(二倍平均值法)实现示范代码
二倍平均值法 优势在于不需要先把每个人得多少算出来,只有拆红包的时候才会算出这个人得多少,减少实时算力 同时保证了每个人拼手气得到的平均值相同 设有10个人,红包总额100元. 100/10X2 = ...
- 水果礼包拼手气(仿红包拼手气)含拼手气红包算法
现阶段有个需求: 现有一个水果礼包,礼包包含多品类.多规格.多数量的拼手气小红包生成. 转化为简单json 如: 礼包内有 {A={a1=3, a2=1}, B={b1=1}, C={c1=5}} 有 ...
- 拼手气红包算法_线段切割法
线段切割法就是将红包的总金额视为一段定长的长度,从中随机切(红包份数-1)个点,然后依次将线段分配. 下面是python的实现,当出现相同切割点时重新取点.这个不是最好的解决相同切割点的方法,如果可以 ...
- 二倍均值随机算法之抢拼手气红包场景应用
拼手气类的游戏,更能激发用户购物和社交的趣味性,以及游戏竞争心理,拼手气类的活动甚至可以影响人们消费心理. 拼手气红包就是最简单的例子,哪怕你手气红包只有0.01元,在众多竞争者中脱颖而出,抢到的那一 ...
- JAVA 拼手气红包 领取算法 记录
废话不多说,直接上代码 //平分红包public static final Integer normalPacket = 1;//拼手气红包public static final Integer lu ...
- 解析拼手气红包金额划分算法
文章目录 问题抽象 问题简化 思路一 思路二 思路三 结束语 "叮咚",微信提示音响起,打开手机发现"相亲相爱一家人"的群里收到一个红包,天不负我,这一次终于抢 ...
最新文章
- 元学习—Meta Learning的兴起
- Redis常用命令入门5:有序集合类型
- 安装搜狗输入法之后 Linux Mint 19.1 字体发虚解决方案
- 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大
- ZooKeeper配额指南
- 让你开回家过年!特斯拉计划春节前开始交付国产Model 3
- 剪枝综述论文阅读:Methods for Pruning Deep Neural Networks
- matlab2c使用c++实现matlab函数系列教程-mean函数
- 喜乐美容美发管理系统 v20070625 加强版 下载
- 如何去除计算机病毒,怎么清除计算机病毒
- 苹果cms替换资源_苹果cmsV10整合云转码(PPVOD)插件
- Spark高频面试题总结
- 如何将XML转换为HL7
- oracle单表空间预估,使用ARIMA和腾讯的Metis时序数据异常检测来预测系统空间容量变化趋势...
- 【分库分表ShardingSphere】
- 如何快速分割多个视频,提取每个原音频单独保存
- AndroidStudio 自带avd模拟器WiFi网络受限无法连接
- Python量化交易平台开发教程系列1-类CTP交易API的工作原理
- Android 和 H5 交互-框架篇
- 大多数日志文件的后缀名是_log4j(添加日志)