JAVA 实现简单抢红包算法 (模拟真实抢红包)
这里有新鲜出炉的 Java 函数式编程, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 JAVA 实现简单抢红包算法 (模拟真实抢红包) 的实例代码, 非常不错, 具有参考借鉴价值, 需要的朋友可以参考下
闲来无事, 最近项目需求要写出用户登录首页来发现金红包, 没有限额我就自己稍微计算了一下如果有限额该怎么写觉得这样与微信红包差不多等项目需求完成以后正好来博客贴一下我自己写的拆红包算法个人觉得这个算法比较模拟现实抢红包规则废话少说先贴代码;
- import java.math.BigDecimal;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import java.util.Random;
- public class TestMain {
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- List < BigDecimal > moneys = math(BigDecimal.valueOf(10), 6);
- if (moneys != null) {
- BigDecimal b = new BigDecimal(0);
- for (BigDecimal bigDecimal: moneys) {
- System.out.print(bigDecimal + "元");
- b = b.add(bigDecimal);
- }
- System.out.print("总额:" + b + "元");
- System.out.println();
- }
- }
- }
- /**
- * 计算每人获得红包金额; 最小每人 0.01 元
- * @param mmm 红包总额
- * @param number 人数
- * @return
- */
- public static List < BigDecimal > math(BigDecimal mmm, int number) {
- if (mmm.doubleValue() < number * 0.01) {
- return null;
- }
- Random random = new Random();
- // 金钱, 按分计算 10 块等于 1000 分
- int money = mmm.multiply(BigDecimal.valueOf(100)).intValue();
- // 随机数总额
- double count = 0;
- // 每人获得随机点数
- double[] arrRandom = new double[number];
- // 每人获得钱数
- List < BigDecimal > arrMoney = new ArrayList < BigDecimal > (number);
- // 循环人数 随机点
- for (int i = 0; i < arrRandom.length; i++) {
- int r = random.nextInt((number) * 99) + 1;
- count += r;
- arrRandom[i] = r;
- }
- // 计算每人拆红包获得金额
- int c = 0;
- for (int i = 0; i < arrRandom.length; i++) {
- // 每人获得随机数相加 计算每人占百分比
- Double x = new Double(arrRandom[i] / count);
- // 每人通过百分比获得金额
- int m = (int) Math.floor(x * money);
- // 如果获得 0 金额, 则设置最小值 1 分钱
- if (m == 0) {
- m = 1;
- }
- // 计算获得总额
- c += m;
- // 如果不是最后一个人则正常计算
- if (i < arrRandom.length - 1) {
- arrMoney.add(new BigDecimal(m).divide(new BigDecimal(100)));
- } else {
- // 如果是最后一个人, 则把剩余的钱数给最后一个人
- arrMoney.add(new BigDecimal(money - c + m).divide(new BigDecimal(100)));
- }
- }
- // 随机打乱每人获得金额
- Collections.shuffle(arrMoney);
- return arrMoney;
- }
- }
这套代码的思考逻辑:
1. 首先我们要根据人数来把红包金额拆成 N 份, 但是因为平均值问题如果每人分得太平均会显得可玩性不大
2. 其次, 我们该怎么分? 来保证红包可玩性较强其实我觉得这些都不重要毕竟红包只看运气我玩微信红包运气不好 20 元 3 个人分我也抽到过 0.01 元并发量也会很大所以我这套代码只是简单的把所有人都会出一个随机数(随机数范围是 人数 * 100), 把这些人的随机数加在一起然后来算每人随机数的百分比按这个百分比来瓜分红包
以上所述是小编给大家介绍的 JAVA 实现简单抢红包算法(模拟真实抢红包), 希望对大家有所帮助, 如果大家有任何疑问请给我留言, 小编会及时回复大家的在此也非常感谢大家对 PHPERZ 网站的支持!
来源: http://www.phperz.com/article/18/0209/359181.html