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);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java抢红包的红包生成算法

    马上过年了.过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]. 最简单的思路,先保底,每个小红包保证有min,然后每个请求都随机生成一个0到(max-min)范围的整数,再加上min就是红包的钱数. 这个算法虽然简单,但是有一个弊端:最后生成的红包可能都是min钱数的.也就是说可能

  • Java实现抢红包功能

    本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下 关键思想: 1.抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确. 2.由于同时在线人数大,从性能方面考虑,玩家的发红包请求不必及时响应,而由服务端定时执行发红包队列. 下面是主要的代码和实现逻辑说明 1.创建一个类,表示红包这个实体概念.直接采用原子变量保证增减同步.Java的原子变量是一种精度更细的同步机制,在高度竞争的情况下,锁的性能将超过原子变量的性能,但在更真实的竞争情况,原子变量享有更好的性能.

  • java多线程模拟抢红包功能

    今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性. /** * Created by zhanglinqiang on 2016/6/23. */ public class MyTest { public static void main(String[] args) throws InterruptedException { LinkedBlockingQueue<LuckyMoney> luckyMoneys

  • JAVA实现简单抢红包算法(模拟真实抢红包)

    闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额.我就自己稍微计算了一下如果有限额该怎么写.觉得这样与微信红包差不多.等项目需求完成以后.正好来博客贴一下我自己写的拆红包算法.个人觉得这个算法比较模拟现实抢红包规则.废话少说.先贴代码; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.ut

  • java模拟微信抢红包的实例代码

    java简单模拟微信抢红包功能,本例发100元红包,有10个人抢,为了尽可能的公平,每个人的红包金额都要随机(保证结果的不确定性,本例抢红包的次序与红包金额匹配也随机),就是不能出现部分红包偏大部分偏小的情况,在区间0~100上随机生成9个节点,加0和100共11个节点按从小到大排序,各节点之间的差值就是红包金额,保证了红包金额之和等于100. public static void main(String[] args) { // 发100元红包,10人抢 // TODO Auto-genera

  • 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

  • php仿微信红包分配算法的实现方法

    本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int $money 用于分配的金额 * @param int $num 分配人数 */ function RandomMoney($money, $num) { echo "$money元随机分成$num份分别是:<br/>"; $remain=$money; $use=0; for ($i=1; $i<$nu

  • Java高并发系统限流算法的实现

    目录 1 概述 2 计数器限流 2.1 概述 2.2 实现 2.3 结果分析 2.4 优缺点 2.5 应用 3 漏桶算法 3.1 概述 3.2 实现 3.3 结果分析 3.4 优缺点 4 令牌桶算法 4.1 概述 4.2 实现 4.3 结果分析 4.4 应用 5 滑动窗口 5.1 概述 5.2 实现 5.3 结果分析 5.4 应用 1 概述 在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.限流可以认为服务降级的一种,限流是对系统的一种保护措施.即限制流量请求的频率(每秒处理多少个请求

  • recycleview实现拼多多首页水平滑动效果

    本文实例为大家分享了recycleview实现拼多多首页水平滑动效果的具体代码,供大家参考,具体内容如下 1.说明  本例子模仿拼多多首页的水平菜单,原本计划用viewpager实现,但是太麻烦,不合适,尝试用recycleview实现,亲测可运行,自定义支持各种样式效果,高度扩展 2.效果图: 3.下载地址 4.首页 贴一下核心代码  需要源码的请自行下载 /* * Copyright 2017 GcsSloop * * Licensed under the Apache License, V

  • Java 二分查找算法的实现

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删

  • Java数据结构之AC自动机算法的实现

    目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 4 构建fail失配指针 5 匹配文本 6 案例演示 7 总结 1 概念和原理 一般的字符串匹配算法都是匹配一个子串,例如KMP.Trie,那么如果同时匹配多个子串呢?此时就需要用到AC自动机了. AC自动机算法是一个多模式字符串匹配算法,在模式匹配领域被广泛应用,例如违禁词查找替换.搜索关键词查找等等. 关于Trie树和KMP算法,我们此前已经讲解过了: 前缀树Trie的实现原理以及Java代码的实现 KMP算法详解以及Java代码实

  • java几种排序算法的实现及简单分析

    本文实例讲述了java几种排序算法的实现及简单分析.分享给大家供大家参考.具体如下: package test; public class first { /*普通的插入排序*/ public void insertSort(int[] list) { int i, j; list[0] = -999; //相当于设置一个监视哨兵,不用判断是否越界, //但要求数组从第二个数开始即i=1开始存储 for (i = 1; i < list.length; i++) { j = i; while (

  • Java十大经典排序算法的实现图解

    目录 前言 一.排序算法 1.排序算法概述(百度百科) 2.<数据结构与算法>中的排序算法 3.算法分析 二.十大经典排序算法(Java开发版) 1.冒泡排序 2.快速排序 3.基数排序 4.插入排序 5.选择排序 6.希尔排序 7.归并排序 8.计数排序 9.堆排序 10.桶排序 前言 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静态图解和源码实现

  • Java数据结构之KMP算法的实现

    目录 问题介绍 暴力求解 知识补充 Next示例 Next代码 匹配示例 匹配代码 完整代码 本次我们介绍数据结构中的KMP算法,我们会从下面几个角度来介绍: 问题介绍 首先我们先介绍适用于KMP算法的问题: 给定一个字符串S,以及一个模式串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模式串P在字符串S中多次作为子串出现. 求出模式串P在字符串S中所有出现的位置的起始下标. 我们给出一个问题的简单示例: // 输入 p长度 p s长度 s 3 aba 5 ababa // 输出结果 0

  • Java实现微信发红包

    前言 红包文化源远流长.从古时的红色纸包,到手机App中的手气红包,红包作为一种独特的中华文化传承至今.之前的所有内容中,综合Java这方面的知识,可以模拟发普通红包.那么这篇博客,我将整合之前介绍的所有的技术和知识,编写一个带界面版的 发红包 案例. 需求分析 分析并使用已给出的类,编写程序,设置红包类型. 小贴士 红包类型: 1.普通红包:金额均分.不能整除的,余额添加到最后一份红包中. 2.手气红包:金额随机.各个红包金额累和与总金额相等. 红包场景: 此案例是模拟群主给群成员发红包,群主

随机推荐