第X节:抢红包算法分享
1. 需求
把 x 元钱分给 y 个人,每个人获得钱数不等,有多的,也有少的。
PS: x元钱要精确到分,每个人获得到的钱也是精确到分。
2. 实现思路
(1). 先把 x 元钱 乘以 100,转换成 分,然后除以 y 人得到一个平均值,把这个平均值赋值给 每个人。
(2). 查看一下步骤①中平均值是否除尽了,如果没有除尽,则把剩下的值随机赋值给一个人;如果除尽,则忽略不计。
(3). 继续执行随机,随机次数根据分钱的人数自行设计合理数值。
随机算法为:随机获取两个人A和B,对应的钱数分别为AA和BB,然后随机获取 (0,AA)一个钱数,用A减去它,用B加上它。
3. 代码分享
1 try 2 { 3 string totalMonney = "1000"; //总钱数,单位:元 4 int totalPerson = 100; //总人数 5 6 int m = (int)(Convert.ToDouble(totalMonney) * 100); 7 //红包个数 8 int[] bags = new int[totalPerson]; 9 int avg = m / totalPerson; 10 for (int i = 0; i < totalPerson; i++) 11 { 12 bags[i] = avg; 13 } 14 Random random = new Random(); 15 //剩下的钱平均分给某个人 16 int leftMoney = m - avg * totalPerson; 17 bags[random.Next(0, totalPerson)] += leftMoney; 18 19 //继续随机 20 int sjNum = 1000; //随机次数(根据实际业务来设计随机次数) 21 for (int i = 0; i < sjNum; i++) 22 { 23 //随机生成两个位置 24 int i1 = random.Next(0, totalPerson); 25 int i2 = random.Next(0, totalPerson); 26 int delta = random.Next(0, bags[i1]); 27 bags[i1] -= delta; 28 bags[i2] += delta; 29 } 30 //输出每个人获得的值 31 string msg = ""; 32 for (int i = 0; i < totalPerson; i++) 33 { 34 msg += Convert.ToDouble(bags[i]) / 100 + ","; 35 } 36 Console.WriteLine($"红包为:{msg}"); 37 Console.WriteLine($"总金额为:{ Convert.ToDouble(bags.Sum()) / 100}"); 38 39 } 40 catch (Exception ex) 41 { 42 Console.WriteLine(ex.Message); ; 43 }
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。