====================================================================
这就是拼手速了,是时候展示手速了。
这个算法可以把总金额想象成一条线段,每个人都有机会切一刀,前面的人切剩下的后面的人再接着切,这样越是前面的人截取的长度(理解成领取到的红包金额)越大的概率就越大。
代码:
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<number-1;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 List doubleMeanMethod(double money,int number){
List result = 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<number-1;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);
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
5252646992)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!