第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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
原文地址:https://www.cnblogs.com/yaopengfei/p/11987185.html