`
A牛哥哥
  • 浏览: 149505 次
社区版块
存档分类
最新评论

java 仿微信红包生成

 
阅读更多
传入金额和红包个数即可,直接上代码
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collections;
import java.util.List;

import com.google.common.collect.Lists;

public class RedBagUtils {
    /**
     * 每个红包最小金额,单位为分
     */
    private static final int MIN_MONEY = 1;

    /**
     * 红包金额的离散程度,值越大红包金额越分散
     */
    private static final double DISPERSE = 10;

    /**
     * 根据剩余的红包金额和红包个数,获取一个红包的金额
     * @param amount 剩余金额,单位为元
     * @param count  剩余红包数   
     * @return 红包金额, 单位为元
     */
    public static BigDecimal getOneRedBag(BigDecimal amount, int count) {
        //将 元*100 转为分
        int money = amount.setScale(2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).intValue();
        if (money / count < MIN_MONEY) {
            throw new RuntimeException("最小值设置过大");
        }

        //最大值 = 均值*离散程度
        int max = (int) (money * DISPERSE / count);

        //最大值不能大于总金额
        max = max > money ? money : max;
        return new BigDecimal(randomBetweenMinAndMax(money, count, MIN_MONEY, max)).divide(new BigDecimal(100), 2,
                RoundingMode.HALF_UP);

    }

    /**
     * 在最小值和最大值之间随机产生一个红包
     * @param money
     * @param count
     * @param min : 最小金额
     * @param max : 最大金额
     * @return
     */
    private static int randomBetweenMinAndMax(int money, int count, int min, int max) {
        //最后一个红包直接返回
        if (count == 1) {
            return money;
        }
        //最小和最大金额一样,返最小和最大值都行
        if (min == max) {
            return min;
        }
        //最小值 == 均值, 直接返回最小值
        if (min == money / count) {
            return min;
        }
        //min<=随机数bag<=max
        int bag = ((int) Math.rint(Math.random() * (max - min) + min));

        //剩余的均值
        int avg = (money - bag) / (count - 1);
        //比较验证剩余的红包还够不够分(均值>=最小值 是必须条件),不够分的话就是最大值过大
        if (avg < MIN_MONEY) {
            /*
             * 重新随机一个红包,最大值改成本次生成的红包金额
             * 由于 min<=本次红包金额bag<=max, 所以递归时bag是不断减小的。
             * bag在减小到min之间一定有一个值是合适的,递归结束。
             * bag减小到和min相等时,递归也会结束,所以这里不会死递归。
             */
            return randomBetweenMinAndMax(money, count, min, bag);
        } else {
            return bag;
        }
    }

    public static void main(String[] args) {
        //红包金额
        BigDecimal amount = new BigDecimal(100);
        //红包个数
        int count = 50;

        //累计单个红包的金额,最后这个数要和amount一致才对
        BigDecimal total = new BigDecimal(0);
        List<BigDecimal> list = Lists.newArrayList();
        for (int i = 0; i < count; i++) {
            BigDecimal tem = getOneRedBag(amount.subtract(total), count - i);
            total = total.add(tem);
            list.add(tem);
            System.out.println("第" + (count - i) + "个红包的金额是:" + total + "元");
        }
        //总金额是否相等
        System.out.println("总计金额是否相等:" + (total.compareTo(amount) == 0));
        System.out.println("红包个数:" + list.size());
        System.out.println("红包金额明细:" + list);
        Collections.sort(list);
        System.out.println("排序后的红包明细:" + list);

    }

}
分享到:
评论

相关推荐

    java实现微信红包发放

    在本文中,我们将深入探讨如何使用Java来实现微信红包发放的功能。微信红包是微信支付推出的一项功能,允许用户向其他用户发送一定金额的现金红包,这些红包可以被领取并直接转入接收者的微信钱包。实现这一功能涉及...

    模仿微信发红包代码

    微信红包功能的实现涉及到随机算法、并发处理以及数据库操作等多个技术领域。下面,我们将深入探讨这个主题,以"模仿微信发红包代码"为背景,解析其中涉及的关键知识点。 首先,我们需要理解微信红包的基本逻辑。...

    微信支付 微信红包 JAVA 几行代码搞定

    本文将详细讲解如何使用JAVA实现微信支付、扫码支付和微信红包的接口调用,以及如何进行验签操作,使得整个支付流程安全可靠。 首先,微信支付涉及到的主要接口包括统一下单接口、查询订单接口、退款接口等。统一...

    微信红包 JAVA

    微信红包JAVA是一款基于Java编程语言实现的微信红包功能的示例程序。在微信红包功能中,用户可以将一定金额的现金平均或者随机分配到若干个红包中,然后发送给微信好友或微信群。这个demo旨在帮助开发者理解如何在...

    Java代码实现微信红包功能

    在Java编程环境中,微信红包功能的实现涉及到一系列的面向对象设计、接口定义、类继承以及事件处理等技术。下面将详细解析这个项目的关键知识点。 首先,我们要理解微信红包的核心功能,包括红包发放、红包领取、...

    微信发红包类 + 二维码类 + 批量下载类

    在IT行业中,微信红包、二维码和批量下载是常见的功能需求,尤其在开发微信相关的应用程序时。这个资源包提供了实现这些功能的PHP类和脚本,它们可以帮助开发者快速集成到自己的项目中。 首先,我们来看“微信发...

    Java 实现微信红包分配算法内含源码以及说明书可以自己运行复现.zip

    在本压缩包中,我们关注的是“Java 实现微信红包分配算法”。微信红包分配算法是微信支付中的一个重要功能,它确保了红包金额在随机分配时的公平性与趣味性。以下将详细介绍该算法的实现原理及相关的编程知识。 1. ...

    Java实现仿微信红包分配规则

    Java实现仿微信红包分配规则是一种常见的编程练习,用于模拟微信红包的随机分配策略。下面将详细介绍这个过程: 1. **红包金额限制**:在微信红包的规则中,单个红包的最小金额为1分(即0.01元),最大为200元。在...

    微信红包源码微信CPA微信抽奖活动推广源码

    微信红包和微信抽奖活动在IT行业中是常见的移动互联网营销手段,尤其在微信平台上的应用非常广泛。微信红包源码和微信抽奖活动推广源码涉及到的技术和知识点主要包括以下几个方面: 1. **微信开放平台接口**:微信...

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

    Java模拟微信抢红包的实例代码 本文主要介绍了Java模拟微信抢红包的实例代码,旨在模拟微信抢红包的功能。该实例代码可以作为参考,供感兴趣的小伙伴们学习和参考。 一、 Java模拟微信抢红包的原理 微信抢红包是...

    简易微信发红包源代码.zip

    【简易微信发红包源代码.zip】是一个包含Java编程语言实现的微信红包发放功能的源代码包。这个项目可能是一个小型的微信红包应用示例,用于教学或者个人学习用途。通过分析和理解这些源代码,我们可以深入了解到微信...

    微信红包源代码

    微信红包源代码是微信开发中的一个重要组成部分,它涉及到微信支付平台和社交功能的结合,使得用户可以在微信聊天中发送和接收虚拟红包。红包功能自2014年春节期间推出以来,已经成为微信生态中的一个标志性特性,极...

    多种微信红包前端 后台源码含配置文档

    在IT行业中,微信红包功能已经成为了移动应用中非常流行的一种互动方式,特别是在小程序中,它为用户提供了便捷的社交互动和营销手段。本资源提供的"多种微信红包前端 后台源码含配置文档"旨在帮助开发者快速搭建...

    java写的伪微信红包功能示例代码

    2. 微信红包的实现:该示例代码展示了如何使用Java语言实现微信红包的功能,包括红包的分配、随机数的生成等。 3. 整数类型的使用:在示例代码中,使用int类型来表示红包的金额,以分为单位,避免了使用double类型...

    JAVA-HTTP-生成微信小程序二维码,5种实现方式

    先介绍一下项目场景,主要是通过微信小程序二维码裂变分享,每个账号有专属邀请二维码,分享出去,有新人扫码入驻,就可以得到现金奖励或红包奖励。当然,产品设计会更丰富,不止有裂变模式,还有渠道推广模式,还有...

    微信红包开发(java,groovy)

    微信红包开发涉及到的是微信支付接口的应用,主要使用Java或Groovy语言进行编程。在这个过程中,开发者需要遵循微信官方提供的API文档来实现红包发放功能。首先,我们需要了解几个关键概念: 1. **OpenID**: 用户在...

    Android-java实现仿照微信抢红包算法

    在Android平台上,使用Java语言实现仿照微信抢红包算法是一个常见的编程挑战,它涉及到随机数生成、并发控制以及数据计算等多个技术领域。微信抢红包算法的核心在于公平性和随机性,确保每个用户在合法范围内有相等...

    Android一分钟制作微信红包特效

    本文将深入探讨如何利用Android和Java技术在一分钟内创建类似微信红包的特效。 首先,我们需要理解微信红包的核心功能:随机金额分配、用户点击抢红包后的动画效果以及红包领取状态的实时更新。在Android中,这些...

    高仿微信demo

    仿微信界面的设计,通常包括使用UI/UX设计原则来创建与微信相似的布局和交互。在Android中,可能使用了Material Design指南,而在iOS中,则可能遵循Human Interface Guidelines。开发者需要熟练掌握XML或Storyboard...

    递归文件路径+微信红包随机

    本项目结合了两个核心概念:递归文件路径遍历和微信红包随机分配算法,这些都是Java开发者需要掌握的关键技能。 首先,让我们深入理解递归文件路径遍历。在Java中,遍历电脑上特定路径下的所有文件是常见的需求,...

Global site tag (gtag.js) - Google Analytics