欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼

 更新時(shí)間:2023年06月12日 14:05:14   作者:越走越遠(yuǎn)的風(fēng)  
這篇文章主要為大家詳細(xì)介紹了如何通過SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法,文中的示例代碼簡(jiǎn)潔易懂,具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下

前言

當(dāng)我們參加各種活動(dòng)和抽獎(jiǎng)時(shí),抽獎(jiǎng)環(huán)節(jié)總是能引起極大興趣和關(guān)注。抽獎(jiǎng)的公正性和隨機(jī)性是保證活動(dòng)公平和成功的重要因素。

本文將介紹抽獎(jiǎng)算法的實(shí)現(xiàn)原理及其在Java編程語言中的應(yīng)用,以幫助讀者了解抽獎(jiǎng)程序的實(shí)現(xiàn)細(xì)節(jié),同時(shí)也為讀者提供一些有用的參考和借鑒。

創(chuàng)建抽獎(jiǎng)表

CREATE TABLE `app_draw_prize` (
  `id` bigint NOT NULL,
  `activity_id` int unsigned DEFAULT NULL COMMENT '活動(dòng)id',
  `name` varchar(50) DEFAULT NULL COMMENT '獎(jiǎng)品名稱',
  `url` varchar(200) DEFAULT NULL COMMENT '圖片地址(未使用)',
  `value` varchar(10) DEFAULT '0' COMMENT '值',
  `probability` double unsigned DEFAULT '0' COMMENT '概率',
  `type` tinyint unsigned DEFAULT NULL COMMENT '類型',
  `status` tinyint unsigned DEFAULT '0' COMMENT '上下架狀態(tài):0下架1上架',
  `position` tinyint(1) DEFAULT NULL COMMENT '位置',
  `day_max_times` tinyint unsigned DEFAULT '0' COMMENT '每天最多中獎(jiǎng)次數(shù),大于0時(shí)生效',
  `month_max_times` tinyint unsigned DEFAULT '0' COMMENT '每月最多中獎(jiǎng)次數(shù),大于0時(shí)生效',
  `show` tinyint unsigned DEFAULT '0' COMMENT '是否首頁展示中獎(jiǎng)記錄0否1是',
  `default_prize` tinyint(1) DEFAULT '0' COMMENT '抽獎(jiǎng)上限時(shí)直接返回默認(rèn)獎(jiǎng)品',
  `ref_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '關(guān)聯(lián)id',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='抽獎(jiǎng)獎(jiǎng)品表';

抽獎(jiǎng)代碼

算法思路

1.將獎(jiǎng)品按集合中順序概率計(jì)算成所占比例區(qū)間,放入比例集合。并產(chǎn)生一個(gè)隨機(jī)數(shù)加入其中,排序。

2.排序后,隨機(jī)數(shù)落在哪個(gè)區(qū)間,就表示那個(gè)區(qū)間的獎(jiǎng)品被抽中。

3.返回的隨機(jī)數(shù)在集合中的索引,該索引就是獎(jiǎng)品集合中的索引。

4.比例區(qū)間的計(jì)算通過概率相加獲得。

private DrawPrize doDrawPrize(Long activityId, Long userId) {  
    List<DrawPrize> drawPrizes = drawPrizeMapper.selectList(new LambdaQueryWrapper<DrawPrize>()  
            .eq(DrawPrize::getActivityId, activityId)
            .eq(DrawPrize::getStatus, 1)
            .orderByDesc(DrawPrize::getProbability));  
    List<Double> probLists = new ArrayList<>(drawPrizes.size());  
    Double sumProb = 0D;  
    for (DrawPrize drawPrize : drawPrizes) {  
        sumProb += drawPrize.getProbability();  
    }  
    if (sumProb <= 0) {  
        throw new IllegalArgumentException("抽獎(jiǎng)概率設(shè)置錯(cuò)誤");  
    }  
    Double rate = 0D;  
    for (DrawPrize drawPrize : drawPrizes) {  
        rate += drawPrize.getProbability();  
        probLists.add(rate / sumProb);  
    }  
    double random = Math.random();  
    probLists.add(random);  
    Collections.sort(probLists);  
    DrawPrize drawPrize = drawPrizes.get(probLists.indexOf(random));  
    if (drawPrize.getDayMaxTimes() > 0) {  
        //判斷當(dāng)天中獎(jiǎng)次數(shù)  
        String daily = DateUtil.formatDate(new Date());  
        Long count = drawRecordMapper.selectCount(new LambdaQueryWrapper<DrawRecord>()  
                .eq(DrawRecord::getMemberId, userId)  
                .eq(DrawRecord::getPrizeId, drawPrize.getId())  
                .eq(DrawRecord::getDaily, daily));  
        if (count >= drawPrize.getDayMaxTimes()) {  
        //直接返回謝謝參與  
            return drawPrizes.stream()  
                    .filter(d -> d.getDefaultPrize() == 1)  
                    .findFirst()  
                    .orElseThrow(() -> new IllegalArgumentException("抽獎(jiǎng)錯(cuò)誤"));  
        }  
    }  
    if (drawPrize.getMonthMaxTimes() > 0) {  
        //判斷當(dāng)月中獎(jiǎng)次數(shù)  
        Long count = drawRecordMapper.selectCount(new LambdaQueryWrapper<DrawRecord>()  
                .eq(DrawRecord::getMemberId, userId)  
                .eq(DrawRecord::getPrizeId, drawPrize.getId())  
                .eq(DrawRecord::getMonth, DateUtil.month(new Date())));  
        if (count >= drawPrize.getMonthMaxTimes()) {  
        //直接返回謝謝參與  
            return drawPrizes.stream()  
                    .filter(d -> d.getDefaultPrize() == 1)  
                    .findFirst()  
                    .orElseThrow(() -> new IllegalArgumentException("抽獎(jiǎng)錯(cuò)誤"));  
        }  
    }  
    return drawPrize;  
}

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot抽獎(jiǎng)算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java類的定義與使用舉例詳解

    java類的定義與使用舉例詳解

    這篇文章主要給大家介紹了關(guān)于java類的定義與使用的相關(guān)資料,類的方法是用來定義類的行為,在方法中通過操作類的成員變量、編寫業(yè)務(wù)邏輯、返回 結(jié)果等實(shí)現(xiàn)類的業(yè)務(wù)行為,需要的朋友可以參考下
    2023-11-11
  • spring中的事務(wù)執(zhí)行流程圖解

    spring中的事務(wù)執(zhí)行流程圖解

    這篇文章主要介紹了spring中的事務(wù)執(zhí)行流程圖解,Spring事務(wù)是Spring框架提供的一種管理數(shù)據(jù)庫事務(wù)的機(jī)制,它通過將一系列數(shù)據(jù)庫操作封裝在一個(gè)事務(wù)中,保證這些操作要么全部成功執(zhí)行,要么全部回滾,從而確保數(shù)據(jù)的一致性和完整性,需要的朋友可以參考下
    2023-10-10
  • JAVA中關(guān)于Long類型返回前端精度丟失問題處理辦法

    JAVA中關(guān)于Long類型返回前端精度丟失問題處理辦法

    這篇文章主要介紹了后端JavaBean的id屬性從Long類型改為雪花算法后出現(xiàn)的精度丟失問題,解決方案包括將id字段類型改為字符串或使用Jackson序列化方式,需要的朋友可以參考下
    2024-11-11
  • Spring和SpringBoot比較及區(qū)別解惑

    Spring和SpringBoot比較及區(qū)別解惑

    這篇文章主要介紹了Spring和SpringBoot比較解惑區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot 使用Prometheus采集自定義指標(biāo)數(shù)據(jù)的方案

    SpringBoot 使用Prometheus采集自定義指標(biāo)數(shù)據(jù)的方案

    這篇文章主要介紹了SpringBoot 使用Prometheus采集自定義指標(biāo)數(shù)據(jù),我們?cè)趉8s集群成功搭建了Prometheus服務(wù),今天,我們將在springboot2.x中使用prometheus記錄指標(biāo),需要的朋友可以參考下
    2022-10-10
  • java生成指定范圍的隨機(jī)日期

    java生成指定范圍的隨機(jī)日期

    這篇文章主要為大家詳細(xì)介紹了java生成指定范圍的隨機(jī)日期,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • SpringBoot文件上傳的原理解析

    SpringBoot文件上傳的原理解析

    這篇文章主要介紹了SpringBoot文件上傳的原理解析,SpringBoot 文件上傳是一種方便快捷的方式,可以將文件上傳到服務(wù)器,通過使用SpringBoot的文件上傳功能,可以輕松地實(shí)現(xiàn)文件上傳功能,需要的朋友可以參考下
    2023-10-10
  • java 重載(overload)與重寫(override)詳解及實(shí)例

    java 重載(overload)與重寫(override)詳解及實(shí)例

    這篇文章主要介紹了java 重載(overload)與重寫(override)詳解及實(shí)例的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • JAVA Frame 窗體背景圖片,首位相接滾動(dòng)代碼實(shí)例

    JAVA Frame 窗體背景圖片,首位相接滾動(dòng)代碼實(shí)例

    這篇文章主要介紹了JAVA Frame 窗體背景圖片,首位相接滾動(dòng)代碼示例,需要的朋友可以參考下復(fù)制代碼
    2017-04-04
  • Security中的@PostAuthorize、@PreFilter和@PostFilter詳解

    Security中的@PostAuthorize、@PreFilter和@PostFilter詳解

    這篇文章主要介紹了Security中的@PostAuthorize、@PreFilter和@PostFilter詳解,@PostAuthorize是在方法調(diào)用完成后進(jìn)行權(quán)限檢查,它不能控制方法是否能被調(diào)用,只能在方法調(diào)用完成后檢查權(quán)限決定是否要拋出AccessDeniedException,需要的朋友可以參考下
    2023-11-11

最新評(píng)論