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

}

相关文章
|
1天前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
17 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3天前
|
并行计算 Java API
探索Java中的Lambda表达式:简化代码,提高可读性
【10月更文挑战第5天】Lambda表达式在Java 8中引入,旨在简化集合操作和并行计算。本文通过介绍Lambda表达式的基本概念、语法结构以及实际应用示例,展示了如何利用这一特性编写更加简洁、易读的代码。我们将从Lambda的基础入手,逐步深入到其在函数式接口中的应用,并探讨其对Java编程范式的影响。
|
4天前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
18 3
|
5天前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
27 3
|
4天前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
24 2
|
4天前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
19 2
|
9天前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
45 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
9天前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
33 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
9天前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
49 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!