Java | Manuel pour vous apprendre à mettre en œuvre un système de loterie (version Java)

Tangcheng 2021-11-25 17:15:25
java manuel pour vous apprendre

Source::blog.csdn.net/wang258533488/article/details/78901303

1 Généralités

Il y a souvent une demande pour des campagnes de marketing comme des tirages dans le développement de projets,Par exemple:Grande plaque tournante intégrale、Gratter、Les machines à sous et bien d'autres formes,En fait, l'implémentation des coulisses est la même,Cet article présente une méthode commune de mise en oeuvre du tirage au sort.

Tout le processus de tirage au sort comprend les aspects suivants:

  • Prix

  • Pool de prix

  • Algorithme de tirage au sort

  • Limite de prix

  • Distribution des prix

2 Prix

Les prix comprennent les prix、Probabilité et limites des prix、Record des prix.

Liste des prix:

CREATE TABLE `points_luck_draw_prize` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL COMMENT 'Nom du prix',
  `url` varchar(50) DEFAULT NULL COMMENT 'Adresse de l'image',
  `value` varchar(20) DEFAULT NULL,
  `type` tinyint(4) DEFAULT NULL COMMENT 'Type1:Sac rouge2:Intégrale3:Experience Gold4:Merci d'être venu.5:Personnalisation',
  `status` tinyint(4) DEFAULT NULL COMMENT 'Statut',
  `is_del` bit(1) DEFAULT NULL COMMENT 'Supprimer ou non',
  `position` int(5) DEFAULT NULL COMMENT 'Emplacement',
  `phase` int(10) DEFAULT NULL COMMENT 'Nombre de périodes',
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=164 DEFAULT CHARSET=utf8mb4 COMMENT='Liste des prix';

Tableau des limites de probabilité des prix :

CREATE TABLE `points_luck_draw_probability` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `points_prize_id` bigint(20) DEFAULT NULL COMMENT 'PrixID',
  `points_prize_phase` int(10) DEFAULT NULL COMMENT ' Nombre de périodes de prix ',
  `probability` float(4,2) DEFAULT NULL COMMENT 'Probabilité',
  `frozen` int(11) DEFAULT NULL COMMENT ' Temps de congélation après extraction des marchandises ',
  `prize_day_max_times` int(11) DEFAULT NULL COMMENT ' Nombre maximum de tirages par jour pour cette plate - forme de produits ',
  `user_prize_month_max_times` int(11) DEFAULT NULL COMMENT ' Nombre maximum de tirages par utilisateur par mois ',
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COMMENT=' Tableau des limites de probabilité de tirage au sort ';

Fiche de prix :

CREATE TABLE `points_luck_draw_record` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `member_id` bigint(20) DEFAULT NULL COMMENT 'UtilisateursID',
  `member_mobile` varchar(11) DEFAULT NULL COMMENT ' Numéro de téléphone de l'utilisateur gagnant ',
  `points` int(11) DEFAULT NULL COMMENT ' Points de consommation ',
  `prize_id` bigint(20) DEFAULT NULL COMMENT 'PrixID',
  `result` smallint(4) DEFAULT NULL COMMENT '1:Gagnant. 2:Non gagné',
  `month` varchar(10) DEFAULT NULL COMMENT ' Mois gagnant ',
  `daily` date DEFAULT NULL COMMENT ' Date de la victoire (Temps non inclus)',
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3078 DEFAULT CHARSET=utf8mb4 COMMENT=' Fiche de tirage au sort ';

3 Pool de prix

Le pool de prix est un pool de tombola assemblé en fonction des probabilités et des limites du prix. . Comprend principalement la valeur totale du pool de prix et la valeur du pool de chaque prix ( Divisé en valeurs de début et de fin )Deux dimensions.

  • Valeur totale du pool pour le prix : Somme de toutes les valeurs du pool de prix .

  • Valeur du pool par prix : Les algorithmes peuvent être modifiés , Il y a deux façons courantes :

    • La probabilité d'un prix *10000( La garantie est un entier )

    • La probabilité d'un prix 10000 Quantité restante du prix

Pool de prixbean:

public class PrizePool implements Serializable{
    /**
     *  Valeur totale du pool
     */
    private int total;
    /**
     *  Prix dans la piscine
     */
    private List<PrizePoolBean> poolBeanList;
}

Prix dans la piscine bean:

public class PrizePoolBean implements Serializable{
    /**
     *  Prix réels dans la base de données ID
     */
    private Long id;
    /**
     *  Valeur du pool de départ du prix
     */
    private int begin;
    /**
     *  Valeur finale du prix
     */
    private int end;
}

Code de montage du pool de prix :

/**
     *  Obtenez un pool de prix pour les super millionnaires
     * @param zillionaireProductMap  Prix super Poly map
     * @param flag true: Il y a de l'argent.   false:Pas d'argent.
     * @return
     */
    private PrizePool getZillionairePrizePool(Map<Long, ActivityProduct> zillionaireProductMap, boolean flag) {
        // Valeur totale du pool de prix
        int total = 0;
        List<PrizePoolBean> poolBeanList = new ArrayList<>();
        for(Entry<Long, ActivityProduct> entry : zillionaireProductMap.entrySet()){
            ActivityProduct product = entry.getValue();
            // Pas de pool de prix en espèces , Filtrer les prix en espèces
            if(!flag && product.getCategoryId() == ActivityPrizeTypeEnums.XJ.getType()){
                continue;
            }
            // Assembler les prix du pool de prix
            PrizePoolBean prizePoolBean = new PrizePoolBean();
            prizePoolBean.setId(product.getProductDescriptionId());
            prizePoolBean.setBengin(total);
            total = total + product.getEarnings().multiply(new BigDecimal("10000")).intValue();
            prizePoolBean.setEnd(total);
            poolBeanList.add(prizePoolBean);
        }
        PrizePool prizePool = new PrizePool();
        prizePool.setTotal(total);
        prizePool.setPoolBeanList(poolBeanList);
        return prizePool;
    }

4 Algorithme de tirage au sort

Tout l'algorithme de tirage au sort est :

  1. Nombre entier à l'intérieur de la valeur totale du pool de prix aléatoires

  2. Comparer tous les prix dans le pool de prix en boucle , Le nombre aléatoire dans la zone de la piscine du prix est le prix gagnant. .

Code du tirage au sort :

public static PrizePoolBean getPrize(PrizePool prizePool){
        // Obtenir la valeur totale du pool de prix
        int total = prizePool.getTotal();
        //Obtenir un nombre aléatoire
        Random rand=new Random();
        int random=rand.nextInt(total);
        // Intervalle du pool de prix de comparaison circulaire
        for(PrizePoolBean prizePoolBean : prizePool.getPoolBeanList()){
            if(random >= prizePoolBean.getBengin() && random < prizePoolBean.getEnd()){
                return prizePoolBean;
            }
        }
        return null;
    }

5 Limite de prix

Dans les tirages réels, il y a souvent des limites quantitatives à certains prix plus importants. ,Par exemple,: C'est le prix le plus gagné par jour. 5Une fois、 Un prix ne peut être tiré qu'une seule fois par utilisateur .. Et ainsi de suite. , Nous divisons ces limites en deux situations pour les traiter différemment. :

  1. Moins de prix limités , Normalement pas plus que 3- Oui.: Dans ce cas, nous pouvons filtrer les prix non admissibles lorsque nous assemblons le pool de prix. , Tous les prix gagnants sont admissibles. .Par exemple, Dans le Code de tirage au sort du super Monopoly ci - dessus , Nous exigeons que les prix en espèces ne soient gagnés qu'une seule fois par jour. 5Une fois, Ensuite, nous pouvons assembler des prix avec de l'argent et des prix sans argent en fonction des critères de jugement. .

  2. Plus de prix limités , Donc si vous voulez utiliser la première méthode , Il en résulte des prix d'assemblage très fastidieux ,Faible performance, Nous pouvons utiliser le prix gagnant pour vérifier si le prix est qualifié. , Si ce n'est pas le cas, un prix fixe peut être retourné. .

6 Distribution des prix

La distribution des prix peut être effectuée en mode usine. : Différents types de prix différents processeurs de distribution de prix ,Voici un exemple de code::

Distribution des prix:

/**
     *  Prix de distribution asynchrone
     * @param prizeList
     * @throws Exception
     */
    @Async("myAsync")
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public Future<Boolean> sendPrize(Long memberId, List<PrizeDto> prizeList){
        try {
            for(PrizeDto prizeDto : prizeList){
                // Filtrer les prix de remerciement
                if(prizeDto.getType() == PointsLuckDrawTypeEnum.XXHG.getType()){
                    continue;
                }
                // Obtenir la catégorie de distribution des prix de l'usine en fonction du type de prix
                SendPrizeProcessor sendPrizeProcessor = sendPrizeProcessorFactory.getSendPrizeProcessor(
                    PointsLuckDrawTypeEnum.getPointsLuckDrawTypeEnumByType(prizeDto.getType()));
                if(ObjectUtil.isNotNull(sendPrizeProcessor)){
                    // Distribuer des prix
                    sendPrizeProcessor.send(memberId, prizeDto);
                }
            }
            return new AsyncResult<>(Boolean.TRUE);
        }catch (Exception e){
            // Si le prix n'est pas délivré, le journal de bord est enregistré.
            saveSendPrizeErrorLog(memberId, prizeList);
            LOGGER.error(" Il y a eu une exception dans le tirage au sort des points ", e);
            return new AsyncResult<>(Boolean.FALSE);
        }
    }

Classe d'usine:

@Component
public class SendPrizeProcessorFactory implements ApplicationContextAware{
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    public SendPrizeProcessor getSendPrizeProcessor(PointsLuckDrawTypeEnum typeEnum){
        String processorName = typeEnum.getSendPrizeProcessorName();
        if(StrUtil.isBlank(processorName)){
            return null;
        }
        SendPrizeProcessor processor = applicationContext.getBean(processorName, SendPrizeProcessor.class);
        if(ObjectUtil.isNull(processor)){
            throw new RuntimeException(" Nom introuvable 【" + processorName + "】 Envoyer le processeur de prix pour ");
        }
        return processor;
    }
}

Exemples de prix :

/**
 *  Catégorie de distribution des prix des enveloppes rouges
 */
@Component("sendHbPrizeProcessor")
public class SendHbPrizeProcessor implements SendPrizeProcessor{
    private Logger LOGGER = LoggerFactory.getLogger(SendHbPrizeProcessor.class);
    @Resource
    private CouponService couponService;
    @Resource
    private MessageLogService messageLogService;
    @Override
    public void send(Long memberId, PrizeDto prizeDto) throws Exception {
        //  Distribuer des paquets rouges
        Coupon coupon = couponService.receiveCoupon(memberId, Long.parseLong(prizeDto.getValue()));
        //Envoyer une lettre à l'intérieur de la station
        messageLogService.insertActivityMessageLog(memberId,
            " Vous avez participé au tirage au sort. " + coupon.getAmount() + " RMB Financial hongbao has been paid ,Merci d'être venu.",
            " Avis de tirage au sort ");
        //ProduitslogLog
        LOGGER.info(memberId + " Tiré au tirage au sort " + prizeDto.getPrizeName() + " Déjà délivré !");
    }
}
版权声明
本文为[Tangcheng]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125171258790H.html

  1. 应急响应入门之Linux分析排查
  2. Twitter如何升级Hadoop+Kafka架构实现实时处理数十亿个事件?
  3. 引人入胜,实战讲解“Java性能调优六大工具”之linux命令行工具
  4. docker 查看实时日志
  5. JFrog Artifactory 7.27 上传应用到私服和从maven私服下载制品
  6. Ces protocoles http simples
  7. [including thesis + source code] JavaWeb hospital triage registration management system SSH [package running successfully]
  8. Java初学者,想知道如何用if语法当条件成立后什么都不执行,否则执行动作
  9. 体验.NET Core使用IKVM对接Java
  10. 深入JavaScript高级语法-coderwhy
  11. 排序算法--Java实例/原理
  12. 停止docker时报错:Warning: Stopping docker.service, but it can still be activated by: docker.socket
  13. 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s
  14. 【Linux】腾讯云服务器,使用FRP内网穿透,端口映射,远程访问内网ubuntu机器
  15. 关于#java#的问题:resultMap type映射不到我想要的类 只能映射java的内部类 加了全路径也映射不了 怎么解决
  16. 排序算法--Java實例/原理
  17. 就这一次,阿里最新出品源码阅读指南,一套搞定JDK+vm源码
  18. 两个小时手写了个Zookeeper分布式服务注册中心
  19. Algorithme de tri - - instance / principe Java
  20. Plongez dans la syntaxe avancée javascript - coderwhy
  21. JavaScript高级程序设计读后感(一)之零碎知识点查漏补缺
  22. 先到先学!Alibaba甩出第四次更新的JDK源码高级笔记(终极版)
  23. Java File类
  24. How To Install MariaDB on linux
  25. #yyds干货盘点# Mybatis 的 XML 配置
  26. Spring认证中国教育管理中心-Spring Data MongoDB教程七
  27. Linux进程和任务管理
  28. Linux文件系统日志分析
  29. Redis-客户端-重点知识
  30. Redis-事件-重点知识
  31. Redis-AOF持久化-重点知识
  32. Redis-RDB持久化-重点知识
  33. http://lx.gongxuanwang.com/sszt/32.htm
  34. 回顾我两个月面试阿里,携程,小红书,美团,网易等等(Java岗)
  35. JavaScript高级程序设计读后感(一)之零碎知识点查漏补缺
  36. Rocketmq source code analysis: message sending process
  37. Rocketmq source code analysis: how does rocketmq store messages?
  38. RocketMQ source analysis: how to debug the RocketMQ source in IDEA
  39. How To Install MariaDB on linux
  40. Comment installer mariadb sur Linux
  41. http://lx.gongxuanwang.com/sszt/7.htm
  42. Classe de fichiers Java
  43. Premier arrivé, premier servi! Alibaba lance la quatrième mise à jour de JDK source Advanced notes (Ultimate)
  44. #yyds干货盘点#设计模式之【工厂模式】
  45. Java * SpringBoot实现万能文件在线预览,已开源,真香
  46. Redis | 第4章 Redis中的数据库《Redis设计与实现》
  47. Liang Tingwei's first variety show of "director, please give advice" reshapes the classic work "spring of a new town"
  48. Redis | 第4章 Redis中的数据库《Redis设计与实现》
  49. 关于centos docker版本过低导致 is not a valid repository/tag: invalid reference format
  50. Redis 源码简洁剖析 02 - SDS 字符串
  51. 回顧我兩個月面試阿裏,攜程,小紅書,美團,網易等等(Java崗)
  52. Rétrospectivement, j'ai passé deux mois à interviewer Ali, ctrip, Little Red Book, meituan, NetEase, etc. (Java post)
  53. Docker + webhook Automation Deployment Front End Project
  54. Java技术之Spring、Hibernate框架整合方法
  55. http://lx.gongxuanwang.com/sszt/32.htm
  56. 亚马逊自己的 Linux 发行版现在完全基于 Fedora 了
  57. Redis 源码简洁剖析 02 - SDS 字符串
  58. Java技術之Spring、Hibernate框架整合方法
  59. Méthode d'intégration des cadres de printemps et d'hibernation de la technologie Java
  60. Redis source Concise Analysis 02 - SDS String