java 模仿拼多多红包递减算法的实现
作者:星期三 发布时间:2022-05-11 11:03:30
标签:java,红包递减
该说不唠,直接上代码。可直接复制使用
package com.yuezhi.util;
import java.math.BigDecimal;
/**
* @ProjectName yuezhi
* @ClassName HongBaoUtils
* @Description 网页分享红包算法
* @Author Wednesday
* @Date 2020/2/4 14:45
* @Version 1.0
**/
public class HongBaoUtils {
/**
* 随机200以内的随机数
* 根据差值再次随机
* 最终差值小于1的时候固定返回0.01
*/
public static BigDecimal getOneRandomNumber(BigDecimal bd) {
Double number = bd.setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
if (number >= 200) {//判断数值是否≥200,是则是第一次随机
//此处让第一个150<随机数<190
double db = (Math.random() * (190 - 150)) + 150;
BigDecimal bg = new BigDecimal(db);
return bg.setScale(2, BigDecimal.ROUND_DOWN);
} else if (number >= 1) {//判断数值是否≥1,是则是第N次随机
return getOneRandomNumber(BigDecimal.valueOf(0), bd);
} else {//上述条件都不满足,则让之后每次都返回0.01
return new BigDecimal(0.01);
}
}
public static BigDecimal getOneRandomNumber(BigDecimal minBig, BigDecimal maxBig) {
//随机一个数,数值经度保留小数点后两位
double db = (Math.random() * (maxBig.subtract(minBig).setScale(2, BigDecimal.ROUND_DOWN).doubleValue()) + minBig.setScale(2, BigDecimal.ROUND_DOWN).doubleValue());
BigDecimal bg = new BigDecimal(db);
return bg.setScale(2, BigDecimal.ROUND_DOWN);
}
/**
* 测试方法,根据测试,至少都会获取50次才会让数值等于0
*/
public static void main(String[] args) {
HongBaoUtils hongBaoUtils = new HongBaoUtils();
BigDecimal number = new BigDecimal(200);
int i =0;
while (number.doubleValue() > 0) {
i++;
BigDecimal oneRandomNumber = hongBaoUtils.getOneRandomNumber(number);
System.err.println("获取红包===>" + oneRandomNumber.setScale(2, BigDecimal.ROUND_DOWN));
System.out.println("剩余金额===>" + number.setScale(2, BigDecimal.ROUND_DOWN));
number = number.subtract(oneRandomNumber);
}
System.out.println("总共===>"+i);
}
}
来源:https://blog.csdn.net/weixin_42160515/article/details/104263248


猜你喜欢
- 生成的Android应用APK文件最好进行优化,因为APK包的本质
- 本文实例为大家分享了C#实现语音播报功能的具体代码,供大家参考,具体内容如下环境:window10vs2019 16.5.5.netfram
- 引言在之前的文章里,我们聊到了 Java 标准库中 HashMap 与 LinkedHashMap 的实现原理。HashMap 是一个标准的
- 今天使用Android Studio建了一个新项目,遇到了不少问题,网上也找了不少解决方案都无效(可能Studio版本、项目版本等都不一样,
- EasyDL图像分割介绍创建应用1.进入百度AI开放平台打开控制台:2.在左上角打开产品服务列表,找到EasyDL零门槛AI开放平台:3.打
- 前几天在“Android绘图之渐隐动画”一文中通过画线实现了渐隐动画,但里面有个问题,画笔较粗(大于1)时线段之间会有裂隙,我又改进了一下。
- 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理
- 有时候我们在阅读PDF文档时会遇到这样一种情况:PDF文档页数比较多,但是又没有书签,所以我们不能根据书签快速了解文档所讲解的内容,也不能点
- using System.Collections.Generic;using System.Text;using System;namesp
- 1. 创建线程 1.1 通过构造函数:public Thread(Runnable target, String n
- 首先给一个简单的Builder设计模式的例子:主实现类代码如下:/** * 实体类 包含一个静态内部类 Builder */public c
- 很多朋友问小编springboot项目中怎么集成Swagger呢?swagger世界上最好的api管理工具前言我们为什么要使用api管理工具
- 1. 前言什么是特殊矩阵?C++,一般使用二维数组存储矩阵数据。在实际存储时,会发现矩阵中有许多值相同的数据或有许多零数据,且分布呈现出一定
- 在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties
- 1.问题描述汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚
- 拼图小游戏,学习阶段。很多不足,改进了一下演示图片:J_Puzzle.javaimport java.awt.BorderLayout;im
- 之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进
- 本文实例为大家分享了C#实现单词本功能的具体代码,供大家参考,具体内容如下看到网上有类似的教程视频实现单词本,于是自己敲了一个实现单词本功能
- BufferedReader读取本地文件在使用BufferedWriter写入文件时,如果忘记关闭文件(close)同时也没有调用flush
- 简介本文用示例介绍使用MyBatis-Plus进行多表查询的方法,包括静态查询和动态查询。代码controllerpackage com.e