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]}次");
}
相关推荐
海清河晏11117 小时前
数据结构 | 单链表
数据结构·unity·dreamweaver
mxwin19 小时前
Unity URP 下 MatCap 技术详解 无视光照环境的卡通与质感渲染方案
unity·游戏引擎
山檐雾2 天前
OctreeNode
unity·c#·八叉树
WarPigs2 天前
Unity协程返回值的解决方案
unity·游戏引擎
WarPigs2 天前
Unity单例笔记
unity·游戏引擎
Allen74743 天前
ComfyUI 自动化生产 3D资产 工作流笔记
图像处理·opencv·unity·自然语言处理·3d模型生成·confyui
nnsix3 天前
Unity Windows11 打字中文显示不出来输入法的候选框
unity
adogai3 天前
unity mcp接入 实现一句话生成游戏!
游戏·unity·游戏引擎
mxwin4 天前
Unity Shader 逐像素光照 vs 逐顶点光照性能与画质的权衡策略
unity·游戏引擎·shader·着色器
CDN3604 天前
游戏盾导致 Unity/UE 引擎崩溃的主要原因排查?
游戏·unity·游戏引擎