zoukankan      html  css  js  c++  java
  • 第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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/11987185.html
Copyright © 2011-2022 走看看