游戏抽卡系统设计:从权重随机到概率补偿的完整技术方案
最近在游戏社区里一个看似简单的抽卡机制却让不少玩家又爱又恨——明明想要猫猫糕结果抽到的却是兔兔菇好不容易攒够资源抽菇菇兔却总是与心仪角色擦肩而过。这种随机性带来的挫败感背后其实隐藏着游戏设计中一个关键的技术问题如何平衡随机奖励的公平性与玩家体验。作为开发者我们经常需要设计类似的随机系统无论是游戏中的抽卡机制还是电商平台的优惠券发放甚至是推荐系统的内容分发。传统方案往往依赖简单的随机数生成但这种方法缺乏可控性容易导致用户体验失衡。本文将深入探讨几种实用的概率控制技术从基础算法到高级策略帮助开发者构建更智能、更公平的随机系统。1. 随机系统设计的核心挑战在设计随机奖励系统时开发者面临的最大矛盾是既要保证随机性的公平公正又要避免极端情况比如某个用户连续20次抽不到目标物品带来的负面体验。这种平衡需要从技术层面解决三个关键问题概率模型的准确性简单的均匀随机分布往往无法满足复杂业务需求。比如猫猫糕作为稀有物品其出现概率可能需要动态调整而不是固定值。用户体验的可控性纯粹的随机性会导致部分用户体验极差。需要引入保底机制、概率补偿等技术确保在长期范围内结果趋于合理。系统性能的稳定性高并发场景下的随机算法需要保证性能避免成为系统瓶颈。2. 基础概率算法与实现2.1 权重随机算法最基本的随机系统通常采用权重随机算法。以下是一个Java实现示例// 文件路径src/main/java/com/example/random/WeightedRandom.java import java.util.*; public class WeightedRandom { private ListItem items; private Random random; private double totalWeight; public static class Item { private String name; private double weight; public Item(String name, double weight) { this.name name; this.weight weight; } // getters and setters } public WeightedRandom() { this.items new ArrayList(); this.random new Random(); this.totalWeight 0; } public void addItem(Item item) { items.add(item); totalWeight item.getWeight(); } public Item getRandomItem() { double randomValue random.nextDouble() * totalWeight; double currentWeight 0; for (Item item : items) { currentWeight item.getWeight(); if (randomValue currentWeight) { return item; } } return items.get(items.size() - 1); // fallback } }这种算法的优势是简单直观但缺乏对连续结果的控制能力。2.2 概率补偿机制为了解决连续不中的问题可以引入概率补偿机制。以下是一个带有保底功能的Python实现# 文件路径random_system/compensated_random.py class CompensatedRandom: def __init__(self): self.fail_count {} self.base_probabilities { 猫猫糕: 0.01, # 1%基础概率 兔兔菇: 0.10, # 10%基础概率 菇菇兔: 0.15, # 15%基础概率 普通物品: 0.74 # 74%基础概率 } self.compensation_threshold 50 # 50次未中触发保底 def draw(self, user_id): # 获取用户连续失败次数 fail_count self.fail_count.get(user_id, 0) # 动态调整概率 adjusted_probabilities self._adjust_probabilities(fail_count) # 执行随机选择 result self._weighted_random_choice(adjusted_probabilities) # 更新失败计数 if result 猫猫糕: self.fail_count[user_id] 0 # 重置计数 else: self.fail_count[user_id] fail_count 1 return result def _adjust_probabilities(self, fail_count): adjusted self.base_probabilities.copy() # 保底机制失败次数越多稀有物品概率越高 if fail_count self.compensation_threshold: adjusted[猫猫糕] min(1.0, adjusted[猫猫糕] * (fail_count - self.compensation_threshold 2)) # 重新归一化概率 total sum(adjusted.values()) for key in adjusted: adjusted[key] / total return adjusted def _weighted_random_choice(self, probabilities): import random r random.random() cumulative 0 for item, prob in probabilities.items(): cumulative prob if r cumulative: return item return list(probabilities.keys())[-1] # fallback3. 高级概率控制策略3.1 分层随机系统对于复杂的奖励系统可以采用分层设计将物品按稀有度分组先确定稀有度层级再在层级内随机选择// 文件路径src/main/java/com/example/random/TieredRandomSystem.java public class TieredRandomSystem { private MapString, Double tierProbabilities; // 层级概率 private MapString, ListItem tierItems; // 层级对应的物品列表 public TieredRandomSystem() { initializeTiers(); } private void initializeTiers() { // 定义层级概率 tierProbabilities Map.of( SSR, 0.01, // 超级稀有1% SR, 0.09, // 稀有9% R, 0.30, // 稀有30% N, 0.60 // 普通60% ); // 定义各层级包含的物品 tierItems Map.of( SSR, List.of(new Item(猫猫糕, 1.0)), SR, List.of(new Item(兔兔菇, 0.6), new Item(菇菇兔, 0.4)), R, List.of(new Item(高级材料, 1.0)), N, List.of(new Item(普通材料1, 0.5), new Item(普通材料2, 0.5)) ); } public Item drawItem() { // 第一步确定层级 String selectedTier selectTier(); // 第二步在选中的层级内随机选择物品 return selectItemFromTier(selectedTier); } private String selectTier() { WeightedRandom tierRandom new WeightedRandom(); tierProbabilities.forEach((tier, prob) - tierRandom.addItem(new WeightedRandom.Item(tier, prob))); return tierRandom.getRandomItem().getName(); } private Item selectItemFromTier(String tier) { ListItem items tierItems.get(tier); WeightedRandom itemRandom new WeightedRandom(); items.forEach(item - itemRandom.addItem(item)); return itemRandom.getRandomItem(); } }3.2 时间衰减概率模型某些场景下我们希望概率随着时间或用户行为动态调整# 文件路径random_system/time_decay_model.py class TimeDecayModel: def __init__(self): self.user_activity {} # 记录用户活跃度 self.base_probability 0.01 def get_adjusted_probability(self, user_id, item_id): base_prob self.base_probability # 基于用户活跃度调整 activity_bonus self._calculate_activity_bonus(user_id) # 基于时间衰减长时间未中的补偿 time_bonus self._calculate_time_bonus(user_id, item_id) adjusted_prob base_prob * (1 activity_bonus time_bonus) return min(adjusted_prob, 0.5) # 设置上限避免概率过高 def _calculate_activity_bonus(self, user_id): # 简化实现根据用户最近活跃度给予概率加成 activity self.user_activity.get(user_id, 0) return min(activity * 0.1, 0.3) # 最大30%加成 def _calculate_time_bonus(self, user_id, item_id): # 记录用户对特定物品的抽取历史 # 长时间未中获得该物品时给予补偿 last_success self.get_last_success_time(user_id, item_id) if last_success is None: return 0.0 time_passed datetime.now() - last_success days_passed time_passed.days # 每过7天增加5%概率最大增加50% return min(days_passed // 7 * 0.05, 0.5)4. 数据库设计与实现4.1 用户抽奖记录表-- 文件路径database/schema.sql CREATE TABLE user_draw_records ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL, item_id VARCHAR(50) NOT NULL, item_name VARCHAR(100) NOT NULL, draw_time DATETIME DEFAULT CURRENT_TIMESTAMP, draw_cost DECIMAL(10,2) DEFAULT 0.00, is_special_item BOOLEAN DEFAULT FALSE, probability_used DECIMAL(5,4) NOT NULL, -- 实际使用的概率 INDEX idx_user_id (user_id), INDEX idx_draw_time (draw_time), INDEX idx_item_id (item_id) ); CREATE TABLE user_probability_stats ( user_id BIGINT PRIMARY KEY, total_draws INT DEFAULT 0, special_item_draws INT DEFAULT 0, last_special_item_time DATETIME, continuous_fail_count INT DEFAULT 0, last_update_time DATETIME DEFAULT CURRENT_TIMESTAMP );4.2 概率配置管理表CREATE TABLE probability_config ( id INT AUTO_INCREMENT PRIMARY KEY, item_type VARCHAR(50) NOT NULL, -- 物品类型 item_id VARCHAR(50) NOT NULL, -- 物品ID base_probability DECIMAL(5,4) NOT NULL, -- 基础概率 min_probability DECIMAL(5,4) DEFAULT 0.0001, -- 最小概率 max_probability DECIMAL(5,4) DEFAULT 1.0000, -- 最大概率 compensation_rules JSON, -- 补偿规则配置 effective_start DATETIME DEFAULT CURRENT_TIMESTAMP, effective_end DATETIME DEFAULT 9999-12-31, is_active BOOLEAN DEFAULT TRUE, UNIQUE KEY uk_item_period (item_id, effective_start) );5. 完整系统集成示例5.1 Spring Boot 服务实现// 文件路径src/main/java/com/example/service/DrawService.java Service Transactional public class DrawService { Autowired private UserDrawRecordRepository drawRecordRepository; Autowired private ProbabilityConfigRepository probabilityConfigRepository; Autowired private UserStatsRepository userStatsRepository; public DrawResult performDraw(Long userId, DrawRequest request) { // 1. 获取用户统计信息 UserStats userStats getUserStats(userId); // 2. 计算动态概率 MapString, Double probabilities calculateDynamicProbabilities(userStats); // 3. 执行随机选择 String selectedItemId selectItem(probabilities); // 4. 记录结果 UserDrawRecord record createDrawRecord(userId, selectedItemId, probabilities.get(selectedItemId)); drawRecordRepository.save(record); // 5. 更新用户统计 updateUserStats(userStats, selectedItemId); return new DrawResult(selectedItemId, getItemName(selectedItemId), record.getDrawTime()); } private MapString, Double calculateDynamicProbabilities(UserStats userStats) { MapString, Double baseProbabilities getBaseProbabilities(); MapString, Double adjustedProbabilities new HashMap(); for (Map.EntryString, Double entry : baseProbabilities.entrySet()) { String itemId entry.getKey(); double baseProb entry.getValue(); // 应用补偿规则 double adjustedProb applyCompensationRules(itemId, baseProb, userStats); adjustedProbabilities.put(itemId, adjustedProb); } return normalizedProbabilities(adjustedProbabilities); } private double applyCompensationRules(String itemId, double baseProb, UserStats userStats) { // 保底机制连续失败次数越多概率越高 if (userStats.getContinuousFailCount() 50) { double bonus (userStats.getContinuousFailCount() - 50) * 0.02; return Math.min(baseProb * (1 bonus), 0.5); } // 时间衰减补偿长时间未中获得稀有物品 if (isRareItem(itemId)) { long daysSinceLastRare calculateDaysSinceLastRareItem(userStats); if (daysSinceLastRare 7) { double timeBonus (daysSinceLastRare / 7) * 0.05; return Math.min(baseProb * (1 timeBonus), 0.3); } } return baseProb; } }5.2 控制器层实现// 文件路径src/main/java/com/example/controller/DrawController.java RestController RequestMapping(/api/draw) Validated public class DrawController { Autowired private DrawService drawService; PostMapping(/perform) public ResponseEntityApiResponseDrawResult performDraw( Valid RequestBody DrawRequest request, RequestHeader(X-User-ID) Long userId) { try { DrawResult result drawService.performDraw(userId, request); return ResponseEntity.ok(ApiResponse.success(result)); } catch (InsufficientBalanceException e) { return ResponseEntity.badRequest().body(ApiResponse.error(余额不足)); } catch (DailyLimitExceededException e) { return ResponseEntity.badRequest().body(ApiResponse.error(今日抽奖次数已用完)); } } GetMapping(/history) public ResponseEntityApiResponsePageDrawHistory getDrawHistory( RequestHeader(X-User-ID) Long userId, RequestParam(defaultValue 0) int page, RequestParam(defaultValue 20) int size) { Pageable pageable PageRequest.of(page, size, Sort.by(drawTime).descending()); PageDrawHistory history drawService.getDrawHistory(userId, pageable); return ResponseEntity.ok(ApiResponse.success(history)); } }6. 性能优化与缓存策略6.1 Redis缓存实现// 文件路径src/main/java/com/example/cache/ProbabilityCache.java Component public class ProbabilityCache { Autowired private RedisTemplateString, Object redisTemplate; private static final String PROBABILITY_CACHE_KEY probability:config:%s; private static final String USER_STATS_CACHE_KEY user:stats:%d; private static final long CACHE_EXPIRE_HOURS 24; public ProbabilityConfig getProbabilityConfig(String itemType) { String cacheKey String.format(PROBABILITY_CACHE_KEY, itemType); // 先从缓存获取 ProbabilityConfig config (ProbabilityConfig) redisTemplate.opsForValue().get(cacheKey); if (config ! null) { return config; } // 缓存未命中从数据库加载 config probabilityConfigRepository.findByItemType(itemType); if (config ! null) { redisTemplate.opsForValue().set(cacheKey, config, CACHE_EXPIRE_HOURS, TimeUnit.HOURS); } return config; } public void updateUserStatsCache(Long userId, UserStats stats) { String cacheKey String.format(USER_STATS_CACHE_KEY, userId); redisTemplate.opsForValue().set(cacheKey, stats, 1, TimeUnit.HOURS); } }6.2 数据库查询优化-- 为频繁查询添加合适的索引 CREATE INDEX idx_user_draw_time ON user_draw_records(user_id, draw_time); CREATE INDEX idx_item_type_prob ON probability_config(item_type, base_probability); CREATE INDEX idx_user_fail_count ON user_probability_stats(continuous_fail_count); -- 使用覆盖索引优化统计查询 CREATE INDEX idx_draw_stats ON user_draw_records(user_id, item_id, draw_time) INCLUDE (probability_used, is_special_item);7. 监控与数据分析7.1 抽奖数据统计// 文件路径src/main/java/com/example/service/StatsService.java Service public class StatsService { public DrawStatistics getSystemStatistics(LocalDate startDate, LocalDate endDate) { return drawRecordRepository.calculateStatistics(startDate, endDate); } public ProbabilityDeviation analyzeProbabilityDeviation() { // 分析实际概率与预期概率的偏差 ListProbabilityDeviationItem deviations new ArrayList(); ListItemProbability expected probabilityConfigRepository.findAllActiveProbabilities(); for (ItemProbability expectedProb : expected) { ActualProbability actual drawRecordRepository.getActualProbability( expectedProb.getItemId(), LocalDate.now().minusDays(30), LocalDate.now() ); double deviation Math.abs(actual.getProbability() - expectedProb.getBaseProbability()); deviations.add(new ProbabilityDeviationItem(expectedProb.getItemId(), deviation)); } return new ProbabilityDeviation(deviations); } }7.2 实时监控告警# 文件路径src/main/resources/application-monitor.yml management: endpoints: web: exposure: include: health,metrics,stats metrics: export: prometheus: enabled: true distribution: percentiles: - 0.5 - 0.95 - 0.99 # 自定义监控指标 custom: metrics: draw-success-rate: name: draw_success_rate description: 抽奖成功率 tags: [item_type] probability-deviation: name: probability_deviation description: 概率偏差监控 threshold: 0.01 # 允许的最大偏差8. 常见问题与解决方案8.1 概率偏差问题问题现象实际抽中概率明显低于配置概率可能原因随机算法实现错误、并发问题、概率计算逻辑错误解决方案验证随机数生成器的质量检查概率归一化逻辑添加概率偏差监控告警定期进行概率校准测试// 概率校准测试工具 public class ProbabilityValidator { public void validateProbability(String itemId, int sampleSize) { int successCount 0; for (int i 0; i sampleSize; i) { String result randomSystem.drawItem(); if (result.equals(itemId)) { successCount; } } double actualProbability (double) successCount / sampleSize; double expectedProbability getExpectedProbability(itemId); double deviation Math.abs(actualProbability - expectedProbability); if (deviation 0.01) { // 1%偏差阈值 logger.warn(概率偏差过大: item{}, expected{}, actual{}, itemId, expectedProbability, actualProbability); } } }8.2 并发安全问题问题现象高并发下概率计算不准确用户数据统计错误可能原因缺乏事务控制、竞态条件、缓存一致性問題解决方案使用数据库事务保证数据一致性对用户统计更新加分布式锁采用乐观锁处理并发更新Service public class ConcurrentSafeDrawService { Autowired private RedissonClient redissonClient; public DrawResult safeDraw(Long userId) { String lockKey draw_lock: userId; RLock lock redissonClient.getLock(lockKey); try { lock.lock(5, TimeUnit.SECONDS); // 获取分布式锁 // 在锁内执行抽奖逻辑 return performDraw(userId); } finally { lock.unlock(); } } }9. 生产环境最佳实践9.1 配置管理规范# 文件路径src/main/resources/application-prod.yml draw: system: # 概率配置 probabilities: 猫猫糕: 0.01 兔兔菇: 0.10 菇菇兔: 0.15 default: 0.74 # 保底机制配置 compensation: enabled: true threshold: 50 max-bonus: 0.5 # 限流配置 rate-limit: daily-limit: 100 ip-limit: 1000 # 监控配置 monitoring: deviation-threshold: 0.01 sample-size: 100009.2 安全防护措施参数验证对所有输入参数进行严格验证频率限制防止刷奖和滥用审计日志记录所有抽奖操作便于追溯数据加密敏感数据进行加密存储Component public class DrawSecurityValidator { public void validateDrawRequest(DrawRequest request, Long userId) { // 验证每日次数限制 validateDailyLimit(userId); // 验证资源余额 validateBalance(userId, request.getCost()); // 验证参数合法性 if (request.getCost() 0) { throw new InvalidParameterException(抽奖成本必须大于0); } } private void validateDailyLimit(Long userId) { long todayDraws drawRecordRepository.countTodayDraws(userId); if (todayDraws dailyLimit) { throw new DailyLimitExceededException(今日抽奖次数已达上限); } } }通过以上技术方案我们可以构建一个既保证随机性公平又具备良好用户体验的抽奖系统。关键在于找到技术实现与业务需求的平衡点让猫猫糕兔兔菇的随机抽取既有趣味性又有合理性。在实际项目中建议先从简单版本开始逐步迭代优化。重点关注概率算法的准确性、系统性能的稳定性以及用户体验的可控性这样才能打造出真正优秀的随机奖励系统。

相关新闻

Java构建前端可视化维度指标列表的实践与优化

Java构建前端可视化维度指标列表的实践与优化

1. 项目概述:Java构建前端可视化维度指标列表的核心价值在数据驱动的现代应用开发中,可视化维度指标列表已成为管理后台、数据分析平台和运营系统的标配组件。作为全栈开发中的关键环节,用Java构建这类组件需要兼顾后端数据处理效率和前端展示…

2026/7/31 10:19:22 阅读更多 →
PDF文档差异对比神器:diff-pdf完整使用指南

PDF文档差异对比神器:diff-pdf完整使用指南

PDF文档差异对比神器:diff-pdf完整使用指南 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf 还在为PDF版本对比而烦恼吗?每次收到修订后的文档&#xff0c…

2026/7/31 10:19:22 阅读更多 →
Vue3系统性学习指南:从核心基础到高级实战

Vue3系统性学习指南:从核心基础到高级实战

1. 项目概述:为什么现在必须系统性学习Vue3?如果你是一名前端开发者,或者正打算从前端入门,那么“Vue3”这个词在过去两年里一定反复出现在你的视野里。从2020年9月正式发布到现在,Vue3已经不再是那个需要观望的“新版…

2026/7/31 10:19:22 阅读更多 →

最新新闻

Python subprocess模块实战:高效调用命令行工具并解析JSON输出

Python subprocess模块实战:高效调用命令行工具并解析JSON输出

1. 项目缘起:为什么我们总在命令行和程序之间“反复横跳”?做开发或者运维的朋友,估计都经历过这种场景:你写了一个Python脚本,需要调用一个系统命令,比如用ffmpeg转码一个视频,或者用curl获取一…

2026/7/31 10:59:36 阅读更多 →
杭州萧然医院手术怎么样?

杭州萧然医院手术怎么样?

在萧山待久了都知道,这边不管是开厂做老板的女创业者,还是做电商运营、上班顾家两头转的普通女工,常年连轴转熬大夜,很多人查出来子宫肌瘤、卵巢囊肿、HPV阳性甚至私密相关的问题,不到疼得直不起腰根本不肯去医院&…

2026/7/31 10:59:36 阅读更多 →
海关无害化处理设备供应商推荐:选型标准与清乐智能Y-M05应用解析

海关无害化处理设备供应商推荐:选型标准与清乐智能Y-M05应用解析

关键词:海关无害化处理设备供应商推荐、海关检疫无害化设备、口岸无害化处理机 一、背景:为什么海关检疫需要专用无害化处理设备? 海关口岸是国门安全的第一道防线。根据《中华人民共和国进出境动植物检疫法》,进出境旅客携带的水…

2026/7/31 10:59:36 阅读更多 →
DLSS Swapper终极教程:3分钟学会智能切换游戏DLSS版本,免费提升游戏性能

DLSS Swapper终极教程:3分钟学会智能切换游戏DLSS版本,免费提升游戏性能

DLSS Swapper终极教程:3分钟学会智能切换游戏DLSS版本,免费提升游戏性能 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏卡顿、帧率不稳定而烦恼吗?想提升游戏性能却不知道…

2026/7/31 10:59:36 阅读更多 →
解放双手:阴阳师自动化脚本让你的游戏生活更轻松

解放双手:阴阳师自动化脚本让你的游戏生活更轻松

解放双手:阴阳师自动化脚本让你的游戏生活更轻松 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 你是否厌倦了每天重复刷御魂、打探索、做日常的枯燥生活&#xff1f…

2026/7/31 10:59:35 阅读更多 →
N_m3u8DL-RE终极指南:轻松下载加密流媒体视频的完整教程

N_m3u8DL-RE终极指南:轻松下载加密流媒体视频的完整教程

N_m3u8DL-RE终极指南:轻松下载加密流媒体视频的完整教程 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …

2026/7/31 10:58:35 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻