算法:在指定范围内生成随机不重复的位置

news2024/11/23 6:52:10

问题:

  在游戏中,我们经常会遇到以下问题:在指定的范围内生成随机不重复的位置。

  比如某次“神官赐福”活动中,需要在城门口生成n个不重复的宝箱。

  针对这种问题,我们可以先将范围按照宝箱(基本单元格)大小,切割为m个不同的位置,并用int数组记录它们的编号。最后通过随机剔除的方式,取得需要的随机数。

 

解决方案: 

  抽象为以上图形,即红色区域内,按照绿色单元格切割为长*宽个单元格,最后随机抽取。实际代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


/// <summary>
/// 将区域切分为单元格,并在其中选取随机数组生成
/// </summary>
public class RandomCreat : MonoBehaviour
{

    public Vector3 startPos;

    public Vector3 endPos;

    public Vector3 size;

    public int num;

    // Start is called before the first frame update
    void Start()
    {
        var _list = GetRandomPosInPlane(startPos, endPos, size, num);
        foreach (var idx in _list)
        {
            var _obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            _obj.transform.position = idx;
        }


    }

    // Update is called once per frame
    void Update()
    {
        
    }

    
    /// <summary>
    /// 在同一平面中生成随机不重复数组
    /// </summary>
    /// <param name="_startPos">起始坐标</param>
    /// <param name="_endPos">结束坐标</param>
    /// <param name="_size">格子大小</param>
    /// <param name="_num">获得的个数</param>
    /// <returns></returns>
    public List<Vector3> GetRandomPosInPlane(Vector3 _startPos, Vector3 _endPos, Vector3 _size,int _num)
    {
        //先将位置切割为n个单元格
        var _sizePos = _endPos - _startPos;
        int _x = (int)(_sizePos.x / _size.x);
        int _z = (int)(_sizePos.z / _size.z);
        //将这些单元格按照序号编入数组
        var _allList = new List<int>();
        var _maxNum = _x * _z;
        for (var _i = 0; _i < _maxNum; _i++) _allList.Add(_i);
        //从编号数组中随机出个数
        var _getListNum = new List<int>();
        while (_getListNum.Count < _num && _allList.Count > 0)
        {
            var _r = _allList[Random.Range(0, _allList.Count)];
            _getListNum.Add(_r);
            _allList.Remove(_r);
        }
        //将编号还原为坐标
        var _getList = new List<Vector3>();
        foreach (var idx in _getListNum) 
            _getList.Add(new Vector3(_startPos.x + (0.5f + idx % _x) * _size.x, _startPos.y, _startPos.z + (0.5f + idx / _x) * _size.z));
        return _getList;
    }


}

测试:

    我们可以把脚本挂到一个物体上,从而测试具体的实现效果:

    

   选取10个的时候,则每次结果都不一样。

总结:

  通过以上示例,我们可以抽象出更通用的解决方案。这样以后遇到其它图形或者3D区域,都可以通过这个思路解决:

1,将空间按照基本单元切割为m*n个区域;

2,将所有区域编号并写入int数组

3,通过剔除从int数组中取得我们想要的编号数组

4,再将编号数组转译为我们最终的位置值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

塔望食研院丨百年益生菌,千亿市场正蓝海!

2022年12月塔望咨询开设塔望食品大健康消费研究院&#xff08;简称塔望食研院&#xff09;栏目&#xff0c;塔望食研院以“为食品行业品牌高质量发展赋能”为理念&#xff0c;将不定期发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合外部数据、消费调研数据、企业…

目标追踪篇---yolov8_tracking复现

文章目录 目标追踪篇---yolov8_tracking复现1、下载源代码2、下载权重3、运行代码3.1、运行以下命令&#xff1a;3.2、结果如下3.3、视频结果 目标追踪篇—yolov8_tracking复现 本人的另一篇博客&#xff0c;本博客主要是源代码更新产生的新博客&#xff0c;比较过后两者还是有…

计算多列迭代次数的一种平均列近似方法

比较多列训练集的迭代次数&#xff0c;把多列训练集用单列近似&#xff0c;再通过计算单列的斥力比较迭代次数的大小顺序。 ( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;AB各由5张二值化的图片组成&#xff0c;让A中有5个1&#xff0c;B中全是0&a…

魔兽服务端 MANGOS 数据库结构表中文解释

魔兽服务端 MANGOS 数据库结构表中文解释 MANGOS 数据库结构表 achievement_reward 巫妖王的奖励成就 areatrigger_involvedrelation 传送(区域触发)_包含的任务关系 areatrigger_scripts 区域触发脚本 areatrigger_tavern 进传送门…

优维低代码:个性化桌面配置

导语 优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。…

分布式系统概念和设计——安全模型中的设计和思考落地

分布式系统概念和设计 安全性攻击的形式——窃听&#xff0c;伪装&#xff0c;篡改&#xff0c;拒绝服务等。 可靠的分布式系统设计必须解决暴露的服务接口和不安全网络的问题&#xff0c;而攻击者可能了解其中所使用的算法并部署计算资源。 密码学为消息的私密性和完整性以及认…

Windows环境下的静态库和动态库的使用详解

文章目录 简介lib库的详细说明第一种是静态lib库第二种是lib导入库两种库的说明两种lib库的相同点和不同点 在visual studio下静态lib库的导出和使用导出过程演示使用过程演示使用方式一使用方式二使用方式三使用方式四使用方式五使用方式六使用方式七其他组合方式 在visual st…

2022-04-24:用go语言重写ffmpeg的muxing.c示例。

2022-04-24&#xff1a;用go语言重写ffmpeg的muxing.c示例。 答案2022-04-24&#xff1a; 本程序的大体过程如下&#xff1a; 打开输出文件并写入头部信息。 添加音频和视频流&#xff0c;并为每个流创建 AVCodecContext 对象&#xff0c;根据输入格式设置编码器参数&#x…

Volatile与ThreadLocal

一&#xff1a;Volatile 线程安全三方面 1 可见性&#xff1a;一个线程对共享变量修改&#xff0c;另一个线程可以看到最新结果 2 有序性&#xff1a; 一个线程内&#xff0c;代码编写按顺序执行 3 原子性&#xff1a; 一个线程内多行代码以一个整体运行&#xff0c;期间不能…

查询网站ip地址

IP地址是Internet Protocol&#xff08;互联网协议&#xff09;的一部分&#xff0c;是一个32位的数字&#xff0c;用于标识网络中的设备。它可以让不同的设备在网络上进行通信和交流&#xff0c;是网络通信的基础。IP地址的应用非常广泛&#xff0c;它可以用于识别和定位设备&…

最新数据, 芯片工程师平均月薪高达2.56W !

近日&#xff0c;据2023年一季度经济运行数据统计&#xff0c;其中提及全国居民人均可支配收入达到10870&#xff0c;同比增长3.8%。 2023年第一季度中&#xff0c;共有20个行业平均月薪超1W&#xff0c;除了大家所熟悉的金融行业薪资水平排名靠前&#xff0c;一些高技术制造业…

iOS SFSpeechRecognizer 语音识别

SFSpeechRecognizer 属于 Speech 框架&#xff0c;在 iOS 10 首次出现&#xff0c;并在 iOS13 中进行了比较重大的更新&#xff0c;在 iOS 13 上支持离线语音识别以及语音分析。WWDC2019 展示了其在 AI 领域的进步&#xff0c;其中 iOS 13 设备内置语音识别就是一项比较不错功能…

第二届中国抗衰老化妆品产业发展论坛暨国粹国妆品牌与文化交流会在京召开

消费日报网讯&#xff08;记者 王儒&#xff09;4月18日&#xff0c;以“国粹国妆 抗衰美丽“为主题的第二届中国抗衰老化妆品产业发展论坛暨国粹国妆品牌与文化交流会在北京召开。大会旨在挖掘国粹力量&#xff0c;搭建沟通交流合作的平台&#xff0c;推动中国高端化妆品品牌建…

网工神器:PNETLab模拟器踩坑过程

目录 0、前言 1、PNETLab介绍 2、下载安装 2.1 下载 2.2 导入 2.3 启动 2.4 注册和登录 3、汉化 4、镜像 5、控制台 5.1、HTML控制台 5.2、默认控制台 6、总结 0、前言 由于工作需要&#xff0c;想测试一下SD-WAN&#xff0c;手边既没有测试环境又没有测试设备。突然想…

八年软件测试生涯,是时候做出改变了

五年前&#xff0c;我在南方的大城市&#xff1a;广州&#xff0c;做着一个快乐的游戏测试&#xff0c;工作不太忙&#xff0c;对一切技术充满了好奇心。测试工作不专业&#xff0c;也不受重视。但我有自己的快乐。工作不忙的时候&#xff0c;我今天学学Python&#xff0c;明天…

uniapp + vue3开发中组合式函数必须是一个同步函数

目录 vue3中的组合式函数用法&#xff1a; 官网示例异步组合式函数&#xff1a;同步函数写法 改造成导出async组合式函数时&#xff1a; uniapp无法使用async组合式函数的原因&#xff1a; vue3中的组合式函数使用时&#xff0c;导出的组合式函数必须是一个同步函数。 vue3…

塔望3W消费战略全案丨元力参堂:从0到1,超级大单品跨越式增长

元力参堂 客户&#xff1a;上海弥富生物科技有限公司 品牌&#xff1a;元力参堂 服务&#xff1a;3W消费战略 品牌全案 项目背景 2020年初&#xff0c;一场突如其来的疫情让我们按下了暂停键&#xff0c;大家经历着疫情的考验。长时间的隔离、封闭影响到生产、消费、投资、物…

ChatGPT3分钟写的千字福尔摩斯小说,老师都分辨不出真假

AI写小说&#xff01;感受ChatGPT3分钟写的千字福尔摩斯小说&#xff01;逆天&#xff01; ChatGPT写悬疑小说 其实在最初&#xff0c;测试者要求ChatGPT写一个5000字的故事&#xff0c;但AI居然直接罢工&#xff0c;还言简意赅&#xff1a;“不&#xff0c;太长了。” 于是…

MySQL库和表的操作

1 什么是数据库&#xff1f;什么是SQL&#xff1f; 科学的组织和存储数据&#xff0c;如何高效获取和维护数据 2 一条SQL语句的执行过程 SQL语句就是一个数据库能够识别的指令语言 在实际操作过程中&#xff0c;创建连接&#xff0c;连接MySQL的server mysql -uroot -P330…

PMP证书备考攻略+PMP知识点汇总

一&#xff0c;考PMP好处多 1.能力提升 大型项目&#xff0c;领导专业团队 2.升职加薪 晋升管理岗&#xff0c;优先升职加薪 3.招投标加分 具有PMP证书&#xff0c;企业招标有加分 4.转型利器 助力转型&#xff0c;拓宽职业发展 5.公司支持 企业鼓励学习&#xff0c;报销费用 6…