广告
返回顶部
首页 > 资讯 > 精选 >C#如何实现抢红包算法
  • 610
分享到

C#如何实现抢红包算法

2023-06-29 11:06:15 610人浏览 泡泡鱼
摘要

今天小编给大家分享一下C#如何实现抢红包算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二倍均值法(公平版) 发

今天小编给大家分享一下C#如何实现抢红包算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

二倍均值法(公平版) 

发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则?

所有人抢到金额之和等于红包金额,不能超过,也不能少于。

每个人至少抢到一分钱。

要保证所有人抢到金额的几率相等。

假设剩余红包金额为M,剩余人数为N,那么有如下公式:

每次抢到的金额 = 随机区间 (0, M / N × 2)

这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。举个例子:

假设有10个人,红包总额100元。100/10×2 = 20, 所以第一个人的随机范围是(0,20 ),平均可以抢到10元。
假设第一个人随机到10元,那么剩余金额是100-10 = 90 元。90/9×2 = 20, 所以第二个人的随机范围同样是(0,20 ),平均可以抢到10元。
假设第二个人随机到10元,那么剩余金额是90-10 = 80 元。80/8×2 = 20, 所以第三个人的随机范围同样是(0,20 ),平均可以抢到10元。
以此类推,每一次随机范围的均值是相等的。

  static void Main(string[] args)        {            for (int i = 0; i < 10; i++)            {                var list = DivideRedPackage(100* 100, 10);                Console.WriteLine(string.Join(",", list));                int count = 0;                foreach (var item in list)                {                    count += item;                }                Console.WriteLine(count);            }            System.Console.ReadKey();        }         /// <summary>        /// 产生红包数组        /// </summary>        /// <param name="cashCount">红包总金额,单位分</param>        /// <param name="peopleNumber">红包人数</param>        /// <returns></returns>        static List<int> DivideRedPackage(int cashCount, int peopleNumber)        {            List<int> redPackageList = new List<int>();            if (cashCount <= peopleNumber)            {                for (int i = 0; i < cashCount; i++)                {                    redPackageList.Add(1);                }                 return redPackageList;            }             Random random   = new Random(GetRandomSeed());            int    restCash = cashCount, restPeople = peopleNumber;            for (int i = 0; i < peopleNumber - 1; i++)            {                var cash = random.Next(1, restCash / restPeople * 2);                restCash -= cash;                restPeople--;                redPackageList.Add(cash);            }            redPackageList.Add(restCash);            return redPackageList;        }

例如,产生的结果如下:

1960,189,234,1763,1211,1236,1340,53,1652,362
10000
1032,1380,456,1885,608,857,1541,452,1273,516
10000
976,955,749,936,1990,1177,781,325,527,1584
10000
794,935,272,216,2034,522,455,2313,2260,199
10000
1376,1539,1292,614,443,1874,889,544,821,608
10000
914,15,877,1738,604,932,321,983,3106,510
10000
659,791,800,1066,788,908,991,2473,495,1029
10000
1256,733,1385,667,1192,1237,455,105,2121,849
10000
1941,1173,567,1280,1558,618,183,644,133,1903
10000
1313,735,1198,1173,1288,522,1879,1155,59,678
10000

上述示例中需注意,Random是一个伪随机数生成器,在大多数 windows 系统上,Random 类 (System) | Microsoft Docs 15 毫秒内创建的对象可能具有相同的种子值。因此,如果New Random在循环中使用,就必须提供随机的种子值。我们可以使用RNGCryptoServiceProvider 类 (System.Security.Cryptography) | Microsoft Docs类产生随机树种子。具体代码如下:

        /// <summary>        /// 产生加密的随机数种子值        /// </summary>        /// <returns></returns>        static int GetRandomSeed()        {            byte[] bytes = new byte[4];            System.Security.Cryptography.RNGCryptoServiceProvider rng =                new System.Security.Cryptography.RNGCryptoServiceProvider();            rng.GetBytes(bytes);            return BitConverter.ToInt32(bytes, 0);        }

线段切割法(手速版) 

算法思路如下:

线段分割法就是把红包总金额想象成一条线段,而每个人抢到的金额,则是这条主线段所拆分出的子线段。

当N个人一起抢红包的时候,就需要确定N-1个切割点。

因此,当N个人一起抢总金额为M的红包时,我们需要做N-1次随机运算,以此确定N-1个切割点。

随机的范围区间是(1, M)。当所有切割点确定以后,子线段的长度也随之确定。这样每个人来抢红包的时候,只需要顺次领取与子线段长度等价的红包金额即可。

需要注意一下两点:

每个人至少抢到一分钱。

分割的线段如果重复需要重新切割

具体代码如下:

    class Program    {        static List<int> DivideRedPackage(int cashCount, int peopleNumber)        {            List<int> redPackageList = new List<int>();            if (cashCount <= peopleNumber)            {                for (int i = 0; i < cashCount; i++)                {                    redPackageList.Add(1);                }                return redPackageList;            }             Random    random     = new Random(GetRandomSeed());            int       restPeople = peopleNumber;            List<int> lineList   = new List<int>();            while (restPeople > 1)            {                var line = random.Next(1, cashCount);                if (lineList.Contains(line) == false)                {                    lineList.Add(line);                    restPeople--;                }            }            lineList.Sort();             redPackageList.Add(lineList[0]);            for (int i = 0; i < peopleNumber - 2; i++)            {                var cash = lineList[i + 1] - lineList[i];                redPackageList.Add(cash);            }            redPackageList.Add(cashCount - lineList[lineList.Count - 1]);            return redPackageList;        }        static int GetRandomSeed()        {            byte[] bytes = new byte[4];            System.Security.Cryptography.RNGCryptoServiceProvider rng =                new System.Security.Cryptography.RNGCryptoServiceProvider();            rng.GetBytes(bytes);            return BitConverter.ToInt32(bytes, 0);        }        static void Main(string[] args)        {            for (int i = 0; i < 10; i++)            {                var list = DivideRedPackage(100 * 100, 10);                Console.WriteLine(string.Join(",", list));                int count = 0;                foreach (var item in list)                {                    count += item;                }                Console.WriteLine(count);            }            System.Console.ReadKey();        }    }

输出结果如下:

409,2233,1843,546,983,679,1621,460,369,857
10000
50,472,281,603,577,1007,3929,38,591,2452
10000
194,1241,675,209,3507,1714,1199,596,313,352
10000
2127,578,16,2413,1332,586,91,260,465,2132
10000
1015,1421,963,626,3031,955,171,1112,60,646
10000
118,352,1062,1128,8,374,1879,1707,1755,1617
10000
2805,592,391,90,1468,392,2201,40,1426,595
10000
145,251,2910,59,1065,235,2761,997,1564,13
10000
814,1725,1886,39,696,202,44,992,3099,503
10000
828,1281,2402,579,380,2246,154,855,564,711
10000

以上就是“C#如何实现抢红包算法”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: C#如何实现抢红包算法

本文链接: https://www.lsjlt.com/news/324388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#如何实现抢红包算法
    今天小编给大家分享一下C#如何实现抢红包算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二倍均值法(公平版) 发...
    99+
    2023-06-29
  • C#实现抢红包算法的示例代码
    目录二倍均值法(公平版) 线段切割法(手速版) 二倍均值法(公平版)  发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 1.所有人抢到金额之...
    99+
    2022-11-13
  • Java实现微信抢红包算法有哪些
    这期内容当中小编将会给大家带来有关Java实现微信抢红包算法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。概述14年微信推出红包功能以后,很多公司开始上自己的红包功能,到现在为止仍然有很多红包开发的...
    99+
    2023-06-22
  • Java实现4种微信抢红包算法(小结)
    目录概述 一、剩余金额随机法 二、二倍均值法(微信红包采用此法) 三、整体随机法 四、割线法 概述 14年微信推出红包功能以后,很多公司开始上自己的红包功能,到现在为止仍然有很多红...
    99+
    2022-11-12
  • Javascript如何实现网页抢红包
    这篇文章主要介绍了Javascript如何实现网页抢红包,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一开始用Firefox加Firebug...
    99+
    2022-10-19
  • php如何实现红包算法
    这篇文章主要介绍了 php如何实现红包算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。    private...
    99+
    2022-10-19
  • Android辅助功如何实现自动抢红包
    这篇文章主要介绍Android辅助功如何实现自动抢红包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、描述最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下...
    99+
    2023-05-30
    android
  • Python+Appium实现自动抢微信红包的方法
    这篇文章将为大家详细讲解有关Python+Appium实现自动抢微信红包的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。环境准备appium环境安卓手机usb数据线python环境实现思路我们收到红包...
    99+
    2023-06-15
  • python实现红包裂变算法
    本文实例介绍了python实现红包裂变算法,分享给大家供大家参考,具体内容如下 Python语言库函数 安装:pip install redpackets 使用: import redpackets ...
    99+
    2022-06-04
    红包 算法 python
  • asp.net如何开发微信派发现金红包/H5网页抢红包功能
    这篇文章将为大家详细讲解有关asp.net如何开发微信派发现金红包/H5网页抢红包功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、网页版抢红包功能,前端先做好抢红包的页面;后台配置微信公众号的app...
    99+
    2023-06-14
  • 通过redis的脚本lua实现抢红包功能的方法
    这篇文章主要讲解了通过redis的脚本lua实现抢红包功能的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。redis 脚本介绍Redis从2.6版本开始,通过内嵌支持Lua...
    99+
    2022-10-18
  • java算法如何实现红黑树
    这篇文章主要介绍了java算法如何实现红黑树,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。红黑树定义红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计...
    99+
    2023-05-30
    java
  • js实现指定红包顺序和金额算法
    本文实例为大家分享了js实现指定红包顺序和金额的具体代码,供大家参考,具体内容如下 前言 朋友拜托而写 单个包最小金额为0.01 如果除指定金额外,其余都为...
    99+
    2022-11-12
  • python 实现红包随机生成算法的简单实例
    实例如下: </pre><pre name="code" class="python">#! /usr/bin/python # -*- coding: utf-8 -*- i...
    99+
    2022-06-04
    红包 算法 实例
  • php代码如何实现红包功能
    这篇文章主要介绍“php代码如何实现红包功能”,在日常操作中,相信很多人在php代码如何实现红包功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php代码如何实现红包功能”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
  • JS如何实现红包兔子雨效果
    本篇内容介绍了“JS如何实现红包兔子雨效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!思考与实现首先,思考一下最终的展示效果:在屏幕上会有...
    99+
    2023-07-05
  • C++如何实现并查集算法
    这篇文章主要介绍了C++如何实现并查集算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、并查集的初始化并查集是用一个数组实现的。首先先定义一个数组:int fa...
    99+
    2023-06-29
  • C#如何实现银行家算法
    这篇文章给大家分享的是有关C#如何实现银行家算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.死锁死锁,顾名思义,是一种锁住不可自行解开的死局。在操作系统中,“死锁”用于描述资源分配时,进程互相抢占资源,又因...
    99+
    2023-06-15
  • C++如何实现归并排序算法
    这篇文章将为大家详细讲解有关C++如何实现归并排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。归并算法开始首先要对一段要有序的数字进行排序void merg_sort(int* ...
    99+
    2023-06-25
  • C++如何实现希尔排序算法
    这篇“C++如何实现希尔排序算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++如何实现希尔排序算法”文章吧。1.代码模...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作