java实现红包要多少钱_Java实现抢红包算法,附完整代码(公平版和手速版)

当我们在群里抢红包时真的是手速越快红包金额越大吗?

答案当然是并不是,都说了是拼手气,岂能是拼手速!

不过也可以有拼手速的方法

二倍均值法(公平版)

这是一种很合理很公平的抢红包算法了,绝对不会让你拼手速的,就别天真了。

在此我们假设

红包剩余金额为 M

红包剩余数量为 N

这种算法就是每次都在区间[0,M/N×2] 随机取一个数

假设100元红包发10个人,那么合理的做法应该是每个人领到10元的概率相同。

第一个人随机金额的范围为[0,100/10×2] ,也就是[0,20],这样平均可以领到10元,此时剩余金额为100-10=90。

第二个人随机金额的范围为[0,90/9×2] ,也就是[0,20],这样平均也可以领到10元,此时剩余金额为90-10=80。

第三个人随机金额的范围为[0,80/8×2] ,也就是[0,20],这样平均也可以领到10元。

这样推导下去,每个人领到相同金额的概率应该就是相同的了。

代码:

public static ListdoubleMeanMethod(double money,int number){

Listresult = new ArrayList();

if(money<0&&number<1)

return null;

double amount,sum=0;

int remainingNumber=number;

int i=1;

while(remainingNumber>1){

amount= nextDouble(0.01,2*(money/remainingNumber));

sum+=amount;

System.out.println("第"+i+"个人领取的红包金额为:"+format(amount));

money -= amount;

remainingNumber--;

result.add(amount);

i++;

}

result.add(money);

System.out.println("第"+i+"个人领取的红包金额为:"+format(money));

sum+=money;

System.out.println("验证发出的红包总金额为:"+format(sum));

return result;

}

运行结果:

线段切割法(手速版)

这就是拼手速了,是时候展示手速了。

这个算法可以把总金额想象成一条线段,每个人都有机会切一刀,前面的人切剩下的后面的人再接着切,这样越是前面的人截取的长度(理解成领取到的红包金额)越大的概率就越大。

代码:

public static void lineSegmentCutting(double money,int number){

if(money<0&&number<1)

System.out.println("输入错误!");

double begin=0,end=money;

double y=0;

for(int i=0;i

double nn=0;

double amount=nextDouble(begin,end);

nn=amount-begin;

System.out.println("第"+(i+1)+"个人领取的红包金额为:"+format(nn));

y+=nn;

begin=amount;

}

System.out.println("第"+number+"个人领取的红包金额为:"+format(end-begin));

y+=(end-begin);

System.out.println("验证发出的红包总金额为:"+format(y));

}

运行结果:

完整代码:

package com.zhl.blogTest;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.Scanner;

public class redEnvelope {

/*Random 随机生成一个区间在[min , max]的数值

randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数

int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; */

/**

生成min到max范围的浮点数

**/

public static double nextDouble(final double min, final double max) {

return min + ((max - min) * new Random().nextDouble());

}

public static String format(double value) {

return new java.text.DecimalFormat("0.00").format(value); // 保留两位小数

}

//二倍均值法

public static ListdoubleMeanMethod(double money,int number){

Listresult = new ArrayList();

if(money<0&&number<1)

return null;

double amount,sum=0;

int remainingNumber=number;

int i=1;

while(remainingNumber>1){

amount= nextDouble(0.01,2*(money/remainingNumber));

sum+=amount;

System.out.println("第"+i+"个人领取的红包金额为:"+format(amount));

money -= amount;

remainingNumber--;

result.add(amount);

i++;

}

result.add(money);

System.out.println("第"+i+"个人领取的红包金额为:"+format(money));

sum+=money;

System.out.println("验证发出的红包总金额为:"+format(sum));

return result;

}

//线段切割法

public static void lineSegmentCutting(double money,int number){

if(money<0&&number<1)

System.out.println("输入错误!");

double begin=0,end=money;

double y=0;

for(int i=0;i

double nn=0;

double amount=nextDouble(begin,end);

nn=amount-begin;

System.out.println("第"+(i+1)+"个人领取的红包金额为:"+format(nn));

y+=nn;

begin=amount;

}

System.out.println("第"+number+"个人领取的红包金额为:"+format(end-begin));

y+=(end-begin);

System.out.println("验证发出的红包总金额为:"+format(y));

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.println("这是一段模拟抢红包的代码。");

int number;

double money;

System.out.print("请输入红包总金额:");

money = sc.nextDouble();

System.out.print("请输入红包数量:");

number = sc.nextInt();

//System.out.println(money + " " + number);

//二倍均值法

doubleMeanMethod(money,number);

//System.out.println(doubleMeanMethod(money,number).toString());

//也是可以直接输出list的,为了观察方便,我就在循环中输出了,存在list里主要是为了后续方便数据的使用

System.out.println();

//线段切割法

lineSegmentCutting(money,number);

}

}

来源:http://suo.im/5Fyatk

最近整理一套Java学习资料,包括了Java语法、面向对象、异常、常用类、集合、IO流、多线程、网络编程、JUnit、枚举、注解、反射机制、CSS、HTML、JavaScript、JQuery、ajax、Javaweb、MySQL、JavaEE、SSM框架、springboot、算法、Git、maven、Linux、设计模式、多线程与高并发、视频教程、视频源码、实战项目、电子书、简历模板、高频面试题等等资源,需要的朋友可以关注公众号:有故事的程序员!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

堆和栈概念整理

1.内存管理方式&#xff1a; 堆&#xff1a;一般由程序员分配释放&#xff0c;程序员申请时需要指明大小&#xff0c;leg,C语言中malloc函数&#xff1a;p1(char*)malloc(10),C中&#xff1a;p2new char[20].若程序员不去释放&#xff0c;当程序结束时可能由操作系统释放 &…

.Net之Swagger基础使用

介绍Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。日常可以用于后端开发人员测试接口或者前后端联调使用。从.net5开始&#xff0c;swagger已经集成到vs2019编译器中&#xff0c;可以通过勾对选项“启用OpenAPI支持”显示…

孩子不是笨,他和“最强大脑”差的是这个!

小木最近看到一则消息推送&#xff0c;说家长辅导孩子陪写作业简直就是一道“送命题”。朋友圈更是掀起了一股“提前嫁儿嫁女”的热潮。为什么孩子对数学一点兴趣也没有&#xff1f;为什么再简单的一道题&#xff0c;换个数字换个形式&#xff0c;孩子就一问三不会了&#xff1…

c++ 隐藏进程_Linux 查看进程的动态信息

前言top命令经常用来监控Linux的系统状况&#xff0c;是常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用情况目录一、描述二、top命令常用字段含义三、top中的子命令四、总结五、思维导图一、描述1、top命令经常用来监控Linux的系统状况是常用的性能分析工…

给IT新人的15个建议:苦逼程序员的辛酸反省与总结

很多人表面上看着老实巴交的&#xff0c;实际上内心比谁都好强、自负、虚荣、甚至阴险。工作中见的多了&#xff0c;也就习惯了。 有一些人&#xff0c;什么事都写在脸上&#xff0c;表面上经常得罪人&#xff0c;甚至让人讨厌。但是他们所表现的又未必不是真性情。 我相信大多…

.net core针对async ()=的安全处理

最近在做一个功能需要传递一个委托作为回调逻辑处理&#xff0c;但在使用中定义了async ()>来处理awaiter逻辑那就存在一个安全问题了。了解async/awaiter的朋友一定清楚async void函数带来的致命风险&#xff01;async void会阻断异常路由&#xff0c;即当前函数没有try的情…

这三道题,总有一道你是答不出来的

全世界只有3.14 % 的人关注了数据与算法之美大家好&#xff0c;我是最近过得不太舒心的卢sir。经常被小思妹提的各种奇葩数学题搞得云里雾里的。我一看数学题就想做&#xff0c;没想到这些题目都是奇葩中的奇葩&#xff0c;不是那写错就是这计算错。为了捍卫我最后的倔强&#…

前端对div连线_《前端图形学从入门到放弃》003 三维世界

从本篇起&#xff0c;我们将正式进入webgl的3D世界本篇涵盖的内容包括&#xff1a;webgl它在干啥&#xff1f;如何画一个正方体&#xff1f;如何成为一个“有深度”的正方体&#xff1f;正方体要离家出走了&#xff01;webgl它在干啥&#xff1f;首先我们需要知道webgl的世界其…

为EasyUI 的Tab 标签添加右键菜单

近期研究了下MenuButton,有了新的感悟&#xff0c;原先在那个DEMO中右键支持做法&#xff0c;现在看来真是小儿科啊&#xff01; 前期的准备工作&#xff1a; 1、下载DEMO源码&#xff0c;并升级为最新版本&#xff08;jquery 1.7.2,Easyui 1.2.6&#xff09;,直接替换就可以啦…

C# Task 暂停与取消

前言&#xff1a;①取消task任务之CancellationTokenSource的用法&#xff1b;②task的线程管控方法Task..Wait(time)&#xff0c;Task.WaitAll()&#xff0c; Task.WaitAny(),task.ContinueWith.1.声明参数CancellationTokenSource tokenSource new CancellationTokenSource(…

通过R,让你的数据分析更简便!

R作为一种统计分析软件&#xff0c;广泛应用于生物、医学、电商、新闻等数据相关行业&#xff0c;是目前主流数据应用软件之一。为了更好地帮助大家了解并快速入门R语言&#xff0c;现超级数学建模携手柯老师以R语言为基础&#xff0c;向大家隆重推出《R语言基础》系列课。柯老…

r语言用行名称提取数据框信息显示na_学会这些R语言技巧至少可以节省半年时间...

ubuntu备忘定期清空回收站扩增子数据牢记r ubuntu 相关技巧和备忘待解决问题1&#xff1a;phyloseq有一篇文章案例使用输入和输出文件相同的文件名&#xff0c;无法执行待解决问题2&#xff1a;待解决问题3&#xff1a;样品分组文件太长了&#xff0c;导致提取出来数据存在NA值…

hibernate.cfg.xml的一些事

Hibernate连接数据库的配置文件书写一般有两种方式&#xff1a; 第一种方式&#xff1a;使用开发环境直接连接数据库最后生成hibernate.cfg.xml文件 第二种方式&#xff1a;使用已有的模版直接拷贝的工作的目录下&#xff0c;通过相应的修改获得需要的连接数据库的配置文件&…

NET问答: 如何将 DataTable 转成 IEnumerableT ?

咨询区 Roddy Balkan&#xff1a;我想将一个外域系统中传过来的 DataTable 转成 IEnumerable&#xff0c;下面的代码在 ASP.NET 4.6.1 中是没有问题的。public static IEnumerable<UserAssignmentDto> StaffAssignmentsUsingStoredProcedure(System.Data.DataTable dataT…

columnproperty server sql_获取SQL Server表字段的各种属性

SELECT(CASE WHEN a.colorder1 THEN d.name ELSE END) N表名,a.colorder N字段序号,a.name N字段名,(CASE WHEN COLUMNPROPERTY( a.id,a.name,IsIdentity)1 THEN √ELSE END) N标识,(CASE WHEN (SELECT COUNT(*)FROM sysobjectsWHERE (name in(SELECT nameFROM sysindexesWHE…

配置静态路由下一跳为本地出战接口和IP地址的区别

配置静态路由下一跳为本地出战接口和IP地址的区别 在配置静态路由时&#xff0c;下一跳可以使用下一路由器的IP地址&#xff0c;也可以使用本路由器的出站接口。在点对点的网络中&#xff0c;两者可能没有什么差别&#xff0c;但在以太网中或者NBMA网络类型&#xff0c;两者有很…

使用 Source Generator 自动生成 WEB API

使用 Source Generator 自动生成 WEB APIIntro上次我们介绍了使用 Source Generator 的应用&#xff0c;有小伙伴留言说想要自动生成一套 ABP 相关的东西&#xff0c;我对 ABP 不怎么熟悉&#xff0c;所以写了一个简单版的雏形&#xff0c;可以根据自定义的模板去动态生成&…

Excel中的散点图这么强大,学习了!

全世界只有3.14 % 的人关注了数据与算法之美平时见得最多的也许是柱形图了&#xff0c;但我个人最喜欢的却是散点图。在讲散点图之前&#xff0c;我先阐述一个不太严谨的个人观点。我认为&#xff0c;所有的数据图表都可以分为两类&#xff0c;一类是偏重于展示&#xff0c;一类…

mysql修改字段的顺序_Mysql中如何修改字段的排列顺序?

创建数据表的数据,字段在表中的位置已经确定了。但要修改字段在表中的排列位置,则需要使用ALTER TABLE语句来处理。在MySQL中,修改字段排列位置的基本语法格式如下: ALTER TABLE MODLFY 字段名1 数据类型 FIRST|AFTER 字段名2 在上述格式中,“字段名1”指的是修改位置的字段…

Oracle之PLSQL总结

基本数据类型变量 1. 基本数据类型 Number 数字型 Int 整数型 Pls_integer 整数型&#xff0c;产生溢出时出现错误 Binary_integer 整数型&#xff0c;表示带符号的整数 Char 定长字符型&#xff0c;最大255个字符 Varchar2 变长字符型&#xff0c;最大200…