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]}次");
}
相关推荐
阿松爱学习6 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
淡海水8 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
Martina_03215 天前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
小贺儿开发5 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
WarPigs7 天前
Unity对象不应该使用null传播的问题
unity
每日出拳老爷子8 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone
淡海水8 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
小贺儿开发9 天前
Unity 文物新生 会讲故事的文物展墙
人工智能·科技·unity·ai·视频·互动·演示
淡海水9 天前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc
WarPigs10 天前
Unity在Create菜单添加创建自定义脚本模板选项
unity