当前位置: 首页 > news >正文

【Unity】简单的不重复随机数

以下是一个简单的随机方法,可以从选定的int范围中不重复地随机选取数值。如果超出数值容量,则会重置并重新开始选取。

using UnityEngine; using System.Collections.Generic; public class RandomSelector { private readonly int _min; private readonly int _max; private readonly List<int> _availableNumbers; public RandomSelector(int min, int max) { if (min >= max) { Debug.LogError("min must be less than max"); return; } _min = min; _max = max; _availableNumbers = new List<int>(); // 初始化可用数值列表 Reset(); } // 获取下一个不重复的随机数 public int GetNext() { if (_availableNumbers.Count == 0) { // 如果所有数值都已用完,则重置 Reset(); } // 随机选择一个索引 int index = UnityEngine.Random.Range(0, _availableNumbers.Count); int selectedNumber = _availableNumbers[index]; _availableNumbers.RemoveAt(index); // 移除已选数值 return selectedNumber; } // 重置可用数值列表 private void Reset() { _availableNumbers.Clear(); for (int i = _min; i <= _max; i++) { _availableNumbers.Add(i); } } }

1. 类定义与构造函数

public class RandomSelector { private readonly int _min; private readonly int _max; private readonly List<int> _availableNumbers; public RandomSelector(int min, int max) { if (min >= max) { Debug.LogError("min must be less than max"); return; } _min = min; _max = max; _availableNumbers = new List<int>(); // 初始化可用数值列表 Reset(); } }
功能
  • 定义一个名为RandomSelector的类,用于从指定范围内不重复地随机选取数值。
  • 构造函数接受两个参数:min(最小值)和max(最大值)。
逻辑
  1. 参数校验
    • 检查min是否小于max,否则输出错误信息并终止初始化。
  2. 初始化字段
    • _min_max:存储用户指定的范围。
    • _availableNumbers:用于保存当前可用的数值列表。
  3. 调用Reset方法
    • 初始化_availableNumbers列表,填充从minmax的所有整数。

2. 核心方法:GetNext

public int GetNext() { if (_availableNumbers.Count == 0) { // 如果所有数值都已用完,则重置 Reset(); } // 随机选择一个索引 int index = UnityEngine.Random.Range(0, _availableNumbers.Count); int selectedNumber = _availableNumbers[index]; _availableNumbers.RemoveAt(index); // 移除已选数值 return selectedNumber; }
功能
  • 从可用数值列表中随机选取一个数,并确保不重复选取。
逻辑
  1. 检查列表是否为空
    • 如果_availableNumbers为空(即所有数值已被用完),调用Reset方法重新填充列表。
  2. 随机选择数值
    • 使用UnityEngine.Random.Range生成一个随机索引(范围是[0, _availableNumbers.Count))。
    • 根据索引从列表中取出对应的数值。
  3. 移除已选数值
    • 将选中的数值从列表中移除,确保下次不会重复选取。
  4. 返回结果
    • 返回选中的数值。

3. 辅助方法:Reset

private void Reset() { _availableNumbers.Clear(); for (int i = _min; i <= _max; i++) { _availableNumbers.Add(i); } }
功能
  • 重置可用数值列表,重新填充从minmax的所有整数。
逻辑
  1. 清空列表
    • 调用Clear方法清空_availableNumbers
  2. 重新填充列表
    • 使用循环将minmax的所有整数依次添加到列表中。

4. 使用示例

private RandomSelector _selector; private void Start() { // 创建一个范围为1到10的随机选择器 _selector = new RandomSelector(1, 10); // 获取10个不重复的随机数 for (int i = 0; i < 10; i++) { Debug.Log(_selector.GetNext()); } // 继续获取时,会重置并重新开始 Debug.Log("Resetting..."); for (int i = 0; i < 5; i++) { Debug.Log(_selector.GetNext()); } }
功能
  • 演示如何使用RandomSelector类。
逻辑
  1. 初始化
    • 创建一个范围为110RandomSelector实例。
  2. 首次选取
    • 调用GetNext方法10次,输出不重复的随机数。
  3. 重置后选取
    • 当所有数值用完时,GetNext会自动调用Reset方法。
    • 继续选取5个数值,此时会从重置后的列表中重新开始。

5. 关键点总结

  1. 不重复随机
    • 通过维护一个可用数值列表,并在每次选取后移除已选数值,确保不重复。
  2. 自动重置
    • 当列表为空时,自动调用Reset方法重新填充。
  3. Unity适配
    • 使用UnityEngine.Random替代System.Random,更适合Unity开发环境。

适用场景

  • 需要从固定范围内不重复地随机选取数值的场景,例如:
    • 抽奖系统。
    • 随机生成关卡或敌人。
    • 洗牌算法(如卡牌游戏)。
http://www.cnnetsun.cn/news/2587881.html

相关文章:

  • LyricsGenius源码解析:从API请求到歌词解析的实现原理
  • 如何用chrome-extension-udemy-translate免费翻译任何网站视频字幕?OpenAI与Ollama双引擎配置详解
  • ThinkPad T480/T580/X280黑苹果配置:从硬件兼容到系统优化的完整技术解析
  • 从‘去掉最高最低分’到金融风控:深入聊聊Python数据缩尾(winsorize)的3个高级应用场景
  • CefFlashBrowser:如何构建终极Flash兼容性解决方案的完整指南
  • YOLOv11改进 | YOLOv11利用InceptionNeXt主干,将大核深度卷积分解为四个并行分支,在提升性能的同时显著降低计算成本
  • 构建不可篡改的火焰账本:基于Merkle树与区块链锚定的权威日志系统
  • attachment_fu迁移指南:从acts_as_attachment升级到attachment_fu的完整步骤
  • 开发者指南:OutlookCalDavSynchronizer插件架构与扩展开发
  • Codex自我蒸馏玩法火了!OpenAI员工亲授:复制粘贴就能让AI消灭重复劳动
  • WordPress Widget Boilerplate高级特性解析:5个注册表模式与依赖注入的实战技巧
  • 性能对比分析:DeBERTa-v3-large-zeroshot-v2.0 vs BART-large-mnli vs RoBERTa
  • 从原型到百万DAU:Lovable写作助手开发背后的技术债清零路径(含技术决策树+演进时间轴+回滚SOP)
  • 3个数据协作难题如何被Web端ETL工具彻底革新
  • 【JavaSE - 网络部分07】TCP 收尾:面向字节流(粘包问题)与异常场景处理【传输层】
  • 【Lovable写作助手开发全栈指南】:从零搭建高可用AI写作工具的7大核心模块
  • 小白程序员必看:轻松入门大模型,收藏这份AI涨薪秘籍!
  • 酒店门锁V10SDK接口C#-幽冥大陆(一百25)—东方仙盟
  • MCU量产利器:基于Segger J-Link与JFlash的自动化烧录脚本全解析
  • Informer核心机制剖析:从ProbSparse Attention到长序列预测实战
  • 大模型显示优化之ZeRO-1/ZeRO-2/ZeRO-3
  • 关于大学专业课如何去正确学习
  • 阿里云个人测试SSL证书申请及部署
  • Android系统中的AI融合技术:架构设计与实践
  • Prompt工程×前端渲染×实时协同,Lovable写作助手开发全流程解析,含GitHub可运行代码库
  • 三相异步电动机定子磁动势的谐波分析与抑制策略
  • AI Agent上云到底卡在哪?揭秘92%团队在K8s调度Agent时忽略的4个Operator级配置漏洞
  • 科研党福音:手把手教你搞定Matlab+Gurobi学术版安装(附IP验证避坑指南)
  • cartopy 绘制中国地图:从基础边界到南海诸岛与十段线的完整实践
  • 5分钟学会B站缓存视频转换:永久保存你收藏的珍贵内容