最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實現(xiàn)抽獎算法的示例代碼

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

前言

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

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

創(chuàng)建抽獎表

CREATE TABLE `app_draw_prize` (
  `id` bigint NOT NULL,
  `activity_id` int unsigned DEFAULT NULL COMMENT '活動id',
  `name` varchar(50) DEFAULT NULL COMMENT '獎品名稱',
  `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 '每天最多中獎次數(shù),大于0時生效',
  `month_max_times` tinyint unsigned DEFAULT '0' COMMENT '每月最多中獎次數(shù),大于0時生效',
  `show` tinyint unsigned DEFAULT '0' COMMENT '是否首頁展示中獎記錄0否1是',
  `default_prize` tinyint(1) DEFAULT '0' COMMENT '抽獎上限時直接返回默認獎品',
  `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='抽獎獎品表';

抽獎代碼

算法思路

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

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

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

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

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("抽獎概率設(shè)置錯誤");  
    }  
    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) {  
        //判斷當天中獎次數(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("抽獎錯誤"));  
        }  
    }  
    if (drawPrize.getMonthMaxTimes() > 0) {  
        //判斷當月中獎次數(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("抽獎錯誤"));  
        }  
    }  
    return drawPrize;  
}

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

相關(guān)文章

  • idea中項目前端網(wǎng)頁圖標不顯示的原因及解決

    idea中項目前端網(wǎng)頁圖標不顯示的原因及解決

    這篇文章主要介紹了idea中項目前端網(wǎng)頁圖標不顯示的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java位集合之BitMap、BitSet和布隆過濾器示例解析

    Java位集合之BitMap、BitSet和布隆過濾器示例解析

    這篇文章主要介紹了Java中位集合的基本概念、實現(xiàn)方法以及應(yīng)用場景,包括Bit-Map、BitSet和BloomFilter,Bit-Map通過位操作高效地存儲和查詢元素狀態(tài),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • SpringBoot項目訪問任意接口出現(xiàn)401錯誤的解決方案

    SpringBoot項目訪問任意接口出現(xiàn)401錯誤的解決方案

    今天小編就為大家分享一篇關(guān)于SpringBoot項目訪問任意接口出現(xiàn)401錯誤的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • springboot全局配置文件與多環(huán)境配置的全過程

    springboot全局配置文件與多環(huán)境配置的全過程

    SpringBoot項目在多環(huán)境配置上表現(xiàn)的非常優(yōu)秀,只需要非常簡單的操作就可以完成配置,下面這篇文章主要給大家介紹了關(guān)于springboot全局配置文件與多環(huán)境配置的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • @Validated驗證List集合的方法示例

    @Validated驗證List集合的方法示例

    這篇文章主要介紹了@Validated驗證List集合的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • SpringBoot實現(xiàn)WebSocket全雙工通信的項目實踐

    SpringBoot實現(xiàn)WebSocket全雙工通信的項目實踐

    本文主要介紹了SpringBoot實現(xiàn)WebSocket全雙工通信的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Java編寫計算器的常見方法實例總結(jié)

    Java編寫計算器的常見方法實例總結(jié)

    這篇文章主要介紹了Java編寫計算器的常見方法,結(jié)合實例形式總結(jié)分析了Java實現(xiàn)計算器功能的常用方法,需要的朋友可以參考下
    2016-04-04
  • java 獲取對象中為null的字段實例代碼

    java 獲取對象中為null的字段實例代碼

    這篇文章主要介紹了java 獲取對象中為null的字段實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Java8中Lambda表達式的理解與應(yīng)用

    Java8中Lambda表達式的理解與應(yīng)用

    Java8最值得學習的特性就是Lambda表達式和Stream?API,如果有python或者javascript的語言基礎(chǔ),對理解Lambda表達式有很大幫助,下面這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達式的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Spring之什么是ObjectFactory?什么是ObjectProvider?

    Spring之什么是ObjectFactory?什么是ObjectProvider?

    這篇文章主要介紹了Spring之什么是ObjectFactory?什么是ObjectProvider?具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評論

佛坪县| 醴陵市| 辉县市| 汪清县| 龙州县| 吴忠市| 鄂托克前旗| 衡山县| 康马县| 邯郸县| 莎车县| 新源县| 乾安县| 大名县| 肃南| 库尔勒市| 稷山县| 麻阳| 双江| 华亭县| 特克斯县| 陇南市| 海口市| 云霄县| 巴彦淖尔市| 余江县| 麦盖提县| 泾阳县| 广元市| 获嘉县| 高碑店市| 北票市| 长顺县| 关岭| 石狮市| 马鞍山市| 利辛县| 新河县| 沙洋县| 万全县| 禹州市|