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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    PHP数组
    java中线程池的几种实现方式
    JAVA是是如何处理字符的。
    byte范围及8种常见数据类型
    对Spring 及SpringMVC的理解
    Nginx+Tomcat搭建负载均衡
    nginx + tomcat配置负载均衡
    Java并发编程:Lock
    Java内部类详解
    奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/11987185.html
Copyright © 2011-2022 走看看