发布时间:2026/7/21 3:24:33
HarmonyOS应用实战-启示散页-05-随机抽答案要避免连续重复:把算法放进服务层 HarmonyOS应用实战-启示散页-05-随机抽答案要避免连续重复把算法放进服务层答案之书的核心体验是“提问后给一个答案”。如果连续两次抽到同一句用户会立刻觉得应用敷衍如果页面自己写随机算法动画页、快捷入口和未来的小组件入口又可能各抽各的。随机不是 UI 小细节它是产品体验规则应该放在服务层统一处理。这篇文章会把问题拆成四个可落地的点把抽取算法从页面移到 AnswerDrawService。用最近结果窗口降低连续重复概率。区分候选池、运行期状态和展示动画。给出小题库、空题库、过滤后无结果的兜底策略。1. 随机体验不等于 Math.randomMath.random()能给出随机下标但不能保证体验。题库只有十几条时连续重复很容易出现用户提问后看到同一句答案会把算法概率理解成产品问题。答案之书把抽取逻辑放进 Service让所有入口都使用同一套规则。interfaceDrawAnswerOptions{deckId:string;question?:string;excludeRecent?:boolean;}interfaceDrawAnswerResult{deckId:string;answer:Answer;drawnAt:number;question?:string;}抽取结果不是一段文本而是带题库、问题和时间的领域结果。这样后续收藏和历史才能拿到完整来源。2. 候选池先由 Service 准备页面不应该自己加载题库再筛答案。Service 先读取当前题库过滤空答案再决定是否允许抽取。空题库、损坏题库、当前题库不存在都在这里统一兜底。asyncdraw(options:DrawAnswerOptions):PromiseDrawAnswerResult{constdeck:Deck|nullawaitDeckRepository.loadDeck(options.deckId);if(!deck){thrownewError(当前题库不存在请重新选择题库);}constcandidates:Answer[]deck.answers.filter((item:Answer):booleanitem.text.trim().length0);if(candidates.length0){thrownewError(当前题库没有可抽取的答案);}returnthis.pickFromCandidates(deck.id,candidates,options.question);}候选池准备属于业务层。页面只关心成功展示或失败提示不应该处理题库损坏的细节。3. 最近窗口只影响选择不改题库避免连续重复不需要修改题库顺序也不需要给答案加权。答案之书维护一个运行期 recent 窗口抽取时优先排除最近出现过的答案如果题库太小导致排除后为空就退回全量候选。privatereadonlyrecentAnswerIds:string[][];privatereadonlyrecentLimit:number3;privatefilterRecent(candidates:Answer[]):Answer[]{constfiltered:Answer[]candidates.filter((item:Answer):boolean{return!this.recentAnswerIds.includes(item.id);});returnfiltered.length0?filtered:candidates;}recent 是运行期体验状态不是持久化数据。它影响下一次抽取但不改变用户题库内容。4. 选中后再更新 recentrecent 窗口要在抽取成功后更新不能在动画结束后才更新。否则用户快速连续点击时第二次抽取仍可能看到旧窗口。Service 返回结果前完成状态更新页面动画只负责表现。privateremember(answerId:string):void{this.recentAnswerIds.unshift(answerId);constunique:string[][];this.recentAnswerIds.forEach((id:string):void{if(!unique.includes(id)){unique.push(id);}});this.recentAnswerIds.splice(0,this.recentAnswerIds.length,...unique.slice(0,this.recentLimit));}这段代码把 recent 维护成去重队列。它不追求复杂概率只解决连续重复这个最刺眼的体验问题。5. 随机下标封装成可替换方法本地小应用不需要一上来引入复杂随机库但随机方法应该集中。未来如果要做权重、节日题库或测试可复现只改一个方法不需要翻页面代码。privatechooseIndex(total:number):number{returnMath.floor(Math.random()*total);}privatepickFromCandidates(deckId:string,candidates:Answer[],question?:string):DrawAnswerResult{constpool:Answer[]this.filterRecent(candidates);constanswer:Answerpool[this.chooseIndex(pool.length)];this.remember(answer.id);return{deckId,answer,question,drawnAt:Date.now()};}集中封装不是为了过度抽象而是为了让体验规则只有一个出口。6. DrawingPage 只处理状态机抽取页最容易把算法、动画和导航揉在一起。答案之书更稳的写法是页面进入 loading调用 Service 拿结果进入 revealing动画结束后进入 done。答案是什么由 Service 决定页面只负责让结果被看见。typeDrawingStateidle|drawing|revealing|done|error;StateprivatedrawingState:DrawingStateidle;StateprivatecurrentResult:DrawAnswerResult|nullnull;privateasyncstartDraw():Promisevoid{this.drawingStatedrawing;try{this.currentResultawaitAnswerDrawService.draw({deckId:this.deckId,question:this.question});this.drawingStaterevealing;}catch(err){this.drawingStateerror;}}状态机让页面逻辑可读也让失败态有入口。抽取失败不应该停在半段动画里。7. 收藏和历史使用同一个 DrawAnswerResult如果收藏只存文本历史又存 question后续就无法判断同一句答案来自哪个题库。抽取 Service 返回完整结果后收藏和历史都使用同一份来源信息能减少数据对不上的问题。awaitHistoryService.append({deckId:result.deckId,answerId:result.answer.id,answerText:result.answer.text,question:result.question,createdAt:result.drawnAt});抽取结果是后续功能的源头。源头字段完整收藏、历史、分享才不会各自补猜。8. 小题库要接受重复但不连续卡死如果题库只有两条答案强行不重复会很快无候选。Service 的策略应该是尽量避免最近重复但候选池为空时回退全量。这比一直重试随机更稳也不会出现死循环。constpool:Answer[]candidates.lengththis.recentLimit?this.filterRecent(candidates):candidates;constanswer:Answerpool[this.chooseIndex(pool.length)];体验规则要尊重数据规模。小题库允许重复但仍可以避免最常见的连续同一句。9. 验证与排障抽取验证不要只看“点一次有答案”。要连续抽 20 次观察重复分布切换题库后 recent 是否影响新题库空题库是否给出错误提示收藏和历史是否拿到同一个结果来源。验证点 1. 同一题库连续抽取不频繁出现相邻重复 2. 两条答案的小题库不会死循环 3. 当前题库不存在时页面进入 error 状态 4. 收藏记录包含 deckId、answerId、answerText 5. 历史记录 createdAt 使用抽取结果时间如果动画页偶发空白先看 Service 是否抛错后页面没有进入 error而不是先调整动画时间。验证清单清应用数据后从冷启动进入确认默认数据、页面状态和日志分支符合预期。对本文涉及的写路径准备正常、空值、重复、越界四类输入确认错误停在 Service 或 Repository。页面返回、重新进入、切换题库、收藏、历史或删除后确认对应刷新信号触发重新读取。修改资源或模块归属后重新构建确认 HAP、HAR、HSP 的依赖方向没有反转。涉及真机体验、备份恢复、发布素材的内容单独记录是否已经在设备或平台侧验证。常见问题与处理现象先看哪里处理方式连续抽到同一句recentAnswerIds 是否更新抽取成功后立即记入 recent小题库抽取卡住是否在 while 中强行排重排除后为空就回退全量候选收藏来源丢失是否只保存 answerText保存 DrawAnswerResult 中的 deckId 和 answerId切换题库后结果异常recent 是否跨题库污染recent 可按 deckId 分组或切换时清空小结随机抽取是产品规则不是页面按钮里的临时表达式。把候选池、recent 窗口、结果来源都放进服务层答案之书的核心体验才有一致性。

相关新闻

2026/7/21 3:19:33

如何快速恢复丢失的Ren‘Py游戏源码:终极反编译工具指南

如何快速恢复丢失的RenPy游戏源码:终极反编译工具指南 【免费下载链接】unrpyc A renpy script decompiler 项目地址: https://gitcode.com/gh_mirrors/un/unrpyc 你是否曾经遇到过RenPy游戏项目源码丢失的尴尬情况?或者需要分析已编译的游戏脚本…

2026/7/21 3:19:33

ADC药物研发热潮:技术突破与市场机遇

1. ADC药物赛道为何持续升温?抗体偶联药物(Antibody-Drug Conjugate,简称ADC)作为肿瘤靶向治疗的"生物导弹",近年来已成为全球医药研发最炙手可热的领域之一。根据Evaluate Pharma数据,2023年全球…

2026/7/21 3:19:33

信息素养大赛C++解题:从最大公约数看“必然事件”类数论问题

最近在准备信息素养大赛的同学,特别是C赛道的选手,常常会遇到一类题目:它不单纯考察语法,而是将编程逻辑与数学、概率等基础学科知识紧密结合,考察选手的综合素养。“必然事件”就是其中一道非常经典的题目&#xff0c…

2026/7/22 0:42:23

Java 成员内部类

目录1. 成员内部类2. 获取成员内部类的对象3. 为什么成员内部类中不能存在静态成员( 除final staitic)4. 内部类可以访问外部类的所有成员内部类:在一个类中定义另一个类,只能为外部类服务。 class OutClass{class InnerClass{} }OutClass——外部类Inne…

2026/7/22 0:42:23

YOLOv12涨点改进| CVPR 2026 | 独家特征融合改进篇 | 引入SAFusion语义对齐融合模块,助力无人机航拍、遥感影像、小目标检测、语义分割、实例分割、目标跟踪任务,有效涨点

一、本文介绍 🔥本文给大家介绍使用 SAFusion语义对齐融合模块 改进YOLOv12网络模型,SAFusion模块通过融合浅层细节特征、当前尺度特征与深层语义特征,并依次进行通道级语义对齐、空间位置校正和自适应加权选择,缓解不同层级特征之间的语义差异与空间错位,避免弱小目标信…

2026/7/22 0:42:23

TMS320F2837xD看门狗与低功耗模式联动配置实战指南

1. 项目概述与核心价值在嵌入式系统开发,尤其是工业控制、汽车电子这类对可靠性和功耗有极致要求的领域,系统监控与电源管理是工程师必须啃下的硬骨头。我遇到过不少项目,前期功能跑得挺顺,一到现场长期运行,不是偶尔“…

2026/7/22 0:42:23

一次 Mapreduce job 作业的 AI 分析

作业命令 hadoop fs -rm -r -skipTrash /terasort/terasort-output time hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-

2026/7/22 0:42:23

从零搭建网页RAG检索系统,保姆级向量库落地教程

文章目录 前言一、整套链路先看懂,一步都不能少二、前期依赖包一次性装好三、第一步:Loader,网页转标准Document3.1 Loader是所有文件的统一转换器3.2 用CSS选择器精准提取正文3.3 Document自带两大核心属性 四、第二步:递归切分长…

2026/7/20 6:33:00

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/22 0:02:17

抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具

抓包代理链路下的 TLS 指纹变化分析:为什么调试环境会影响访问结果 摘要 在网页调试、接口联调、自动化巡检和授权采集排查中,抓包是常见手段。但很多开发者会遇到一个现象:正常访问页面时没有问题,一进入抓包或代理调试环境&…

2026/7/22 0:02:17

微信QQ聊天记录误删恢复与备份方案全指南

1. 聊天记录误删的常见场景与恢复思路作为一名长期关注数据安全的技术博主,我处理过上百起聊天记录误删的求助案例。手机误操作、系统升级失败、设备损坏是三大常见诱因。上周就遇到用户更新微信时断电,导致近两年的工作群聊记录全部消失的极端案例。不同…

2026/7/22 0:02:17

2026最新8款个人AI编程免费工具深度实测

作为一名全栈独立开发者,我最近半年一直在折腾副业项目,每个月在AI编程工具上的订阅费算下来其实也不算便宜。作为个人开发者,我们追求的就是用最少的成本获得最高效的开发体验。TRAE 基础版免费,字节跳动出品的国内首款 AI 原生 …

2026/7/21 20:02:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…