Unity开发中常用的随机方法扩展

里面就两种功能

一种是排除掉一定范围内的数

另一种是在一个数组中,基于权重随机生成一个索引

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 随机工具
/// </summary>
public class RandomTool
{
    /// <summary>
    /// 在一个范围中随机,但是排除掉一小个范围
    /// </summary>
    /// <param name="includeMin"></param>
    /// <param name="excludeMax"></param>
    /// <param name="blackMin">排除范围的最小值</param>
    /// <param name="blackMax">排除范围的最大值,会包括这个值</param>
    /// <returns></returns>
    public static int Range(int includeMin, int excludeMax, int blackMin, int blackMax)
    {
        if(blackMin < includeMin || blackMin > excludeMax)
        {
            Debug.LogError("随机数范围异常!");
            return includeMin;
        }

        if(blackMax < blackMin || blackMax > excludeMax)
        {
            Debug.LogError("随机数范围异常!");
            return includeMin;
        }

        int random1 = Random.Range(includeMin, blackMin);
        int random2 = Random.Range(blackMax + 1, excludeMax);
        if(Random.Range(0, 2) == 0)
        {
            return random1;
        }
        else
        {
            return random2;
        }
    }

    /// <summary>
    /// 在一个范围中随机,但是排除掉一小个范围
    /// </summary>
    /// <param name="includeMin"></param>
    /// <param name="excludeMax"></param>
    /// <param name="blackMin">排除范围的最小值</param>
    /// <param name="blackMax">排除范围的最大值,会包括这个值</param>
    /// <returns></returns>
    public static float Range(float includeMin, float excludeMax, float blackMin, float blackMax)
    {
        if (blackMin < includeMin || blackMin > excludeMax)
        {
            Debug.LogError("随机数范围异常!");
            return includeMin;
        }

        if (blackMax < blackMin || blackMax > excludeMax)
        {
            Debug.LogError("随机数范围异常!");
            return includeMin;
        }

        float random1 = Random.Range(includeMin, blackMin);
        float random2 = Random.Range(blackMax + Mathf.Epsilon, excludeMax);
        if (Random.Range(0, 2) == 0)
        {
            return random1;
        }
        else
        {
            return random2;
        }
    }


    /// <summary>
    /// 在一组权重中随机找一个索引
    /// </summary>
    /// <param name="weightArray">权重数组,需要递增</param>
    /// <returns></returns>
    public static int RandomIndex(int[] weightArray)
    {
        int allWeight = 0;
        for(int i = 0; i < weightArray.Length; i++)
        {
            allWeight += weightArray[i];
        }

        int randomWeight = Random.Range(0, allWeight);
        int index = 0;
        int tempWeight = 0;
        for(int i = 0; i < weightArray.Length; i++)
        {
            tempWeight += weightArray[i];
            if(tempWeight > randomWeight)
            {
                index = i;
                break;
            }
        }

        return index;
    }

    /// <summary>
    /// 在一组权重中随机找一个索引
    /// </summary>
    /// <param name="weightArray">权重数组,需要递增</param>
    /// <returns></returns>
    public static int RandomIndex(float[] weightArray)
    {
        float allWeight = 0;
        for (int i = 0; i < weightArray.Length; i++)
        {
            allWeight += weightArray[i];
        }

        float randomWeight = Random.Range(0, allWeight);
        int index = 0;
        float tempWeight = 0;
        for (int i = 0; i < weightArray.Length; i++)
        {
            tempWeight += weightArray[i];
            if (tempWeight > randomWeight)
            {
                index = i;
                break;
            }
        }

        return index;
    }
}

一般的权重用法:

csharp 复制代码
int[] randomNum = new int[] { -11, 999, 10, 66 };
int[] weight = new int[] { 5, 5, 10, 80 };

int[] test = new int[randomNum.Length];
for (int i = 0; i < 1000000; i++)
{
    int index = RandomTool.RandomIndex(weight);
    test[index]++;
}

for (int i = 0; i < test.Length; i++)
{
    Debug.Log($"{randomNum[i]}一共出现了{test[i]}次");
}
相关推荐
晚枫歌F7 分钟前
三层时间轮的实现
网络·unity·游戏引擎
咸鱼永不翻身2 小时前
Lua脚本事件检查工具
unity·lua·工具
leo__5203 小时前
单载波中继系统资源分配算法MATLAB仿真程序
算法·matlab·unity
努力长头发的程序猿4 小时前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
mxwin5 小时前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader
小贺儿开发5 小时前
Unity3D 智能云端数字标牌系统
unity·阿里云·人机交互·视频·oss·广告·互动
魔士于安5 小时前
Unity windows 同步 异步 打开文件文件夹工具
游戏·unity·游戏引擎·贴图·模型
魔士于安6 小时前
unity lowpoly 风格 城市 建筑 道路 交通标志
游戏·unity·游戏引擎·贴图·模型
mxwin6 小时前
Unity GPU Shader 性能优化指南
unity·游戏引擎·shader
董董女友18 小时前
unity mcp 配置指南
unity·游戏引擎