java 概率抽奖代码实现

简介: java 概率抽奖代码实现

package com.sfjiayuan.ld.web.modular.pay;

import com.alibaba.fastjson.JSONObject;
import com.sfjiayuan.ld.web.modular.award.entity.LdDrawAward;

import java.math.BigDecimal;
import java.util.*;

//抽奖核心算法
public class Arithmetic {
// 放大倍数
private static final int mulriple = 1000000;

public static LdDrawAward pay(List<LdDrawAward> aWards) {
    int lastScope = 0;
    // 洗牌,打乱奖品次序
    Collections.shuffle(aWards);
    Map<String, int[]> prizeScopes = new HashMap();
    Map<String, LdDrawAward> prizeQuantity = new HashMap();
    for (LdDrawAward award : aWards) {

        String prizeId = award.getId();
        BigDecimal ratio = new BigDecimal(award.getRatio());
        if ((ratio.compareTo(new BigDecimal(0))) > 0) {

            // 划分区间
            int currentScope = lastScope + ratio.multiply(new BigDecimal(mulriple / 100)).intValue();
            prizeScopes.put(prizeId, new int[]{lastScope+1, currentScope});
            prizeQuantity.put(prizeId, award);
            lastScope = currentScope;
        }
    }
    // 获取1-1000000之间的一个随机数
    int luckyNumber = new Random().nextInt(mulriple)+1;
    LdDrawAward luckyResult = null;
    // 查找随机数所在的区间
    if ((null != prizeScopes) && !prizeScopes.isEmpty()) {
        Set set = prizeScopes.entrySet();
        for (Object o : set) {
            Map.Entry m = (Map.Entry) o;
            String key = (String) m.getKey();
            Object value = m.getValue();
            Integer[] val = JSONObject.parseObject(JSONObject.toJSONString(value), Integer[].class);
            if (luckyNumber >= val[0] && luckyNumber <= val[1]) {
                luckyResult = prizeQuantity.get(key);
                break;
            }
        }
    }
    if (luckyResult == null) {
        // 奖品库存减一
        System.out.println("--------------   " + luckyNumber);
    }
    return luckyResult;
}

public static void main(String[] args) {
    List<LdDrawAward> prizes = new ArrayList();
    LdDrawAward prize1 = new LdDrawAward();
    prize1.setId("1");
    prize1.setRatio("0.0001");
    prize1.setName("电动车");
    prizes.add(prize1);

    LdDrawAward prize2 = new LdDrawAward();
    prize2.setId("2");
    prize2.setRatio("0.2999");
    prize2.setName("电视机");
    prizes.add(prize2);

    LdDrawAward prize3 = new LdDrawAward();
    prize3.setId("3");
    prize3.setRatio("99.7");
    prize3.setName("充电宝");
    prizes.add(prize3);

    int times = 1000000;
    int prize1GetTimes = 0;
    int prize2GetTimes = 0;
    int prize3GetTimes = 0;

    for (int i = 0; i < times; i++) {
        LdDrawAward pay = pay(prizes);
        System.out.println("抽奖到了" + pay);
        switch (pay.getId()) {
            case "1":
                prize1GetTimes++;
                break;
            case "2":
                prize2GetTimes++;
                break;
            case "3":
                prize3GetTimes++;
                break;
        }
    }
    System.out.println("抽奖次数" + times);
    System.out.println("prize1中奖次数" + prize1GetTimes);
    System.out.println("prize2中奖次数" + prize2GetTimes);
    System.out.println("prize3中奖次数" + prize3GetTimes);
}

}

相关文章
|
6天前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
20 2
|
6天前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
50 2
|
1天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
19 10
|
3天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
15 6
|
3天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
4天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
15 3
|
4天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
14 1
|
11天前
|
Java 开发者
在Java编程中,正确的命名规范不仅能提升代码的可读性和可维护性,还能有效避免命名冲突。
【10月更文挑战第13天】在Java编程中,正确的命名规范不仅能提升代码的可读性和可维护性,还能有效避免命名冲突。本文将带你深入了解Java命名规则,包括标识符的基本规则、变量和方法的命名方式、常量的命名习惯以及如何避免关键字冲突,通过实例解析,助你写出更规范、优雅的代码。
36 3
|
11天前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
17 3
|
6天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。