Unity常用随机数算法

后续继续维护

Unity的Random.Range介绍

有两个重载:

        如果参数存在至少一个浮点数那么将会触发public static  float Range(float minInclusive, float maxInclusive); 返回一个范围内的浮点数(包含首尾)

        如果参数都是整形则触发public static  int Range(int minInclusive, int maxExclusive) 返回一个整形(包含首但不包含尾);

/// <summary>
/// 在 [start, end] 整数数组中获取 count 数量的随机不重复数据(首尾都包含)。
/// 例如:[-1, 100] 中随机取 5 个不重复数可能得到 0, 77, 2, 55, 11。
/// </summary>
/// <param name="start">范围起点</param>
/// <param name="end">范围终点</param>
/// <param name="count">要取的随机数个数</param>
/// <returns>随机不重复整数数组</returns>
/// <exception cref="ArgumentException">如果范围或数量不合法时抛出异常。</exception>
private int[] GetRandomArray(int start, int end, int count)
{
    if (start > end)
    {
        throw new ArgumentException("Start must be less than or equal to end.");
    }

    int legalCount = end - start + 1;
    if (legalCount < count || count <= 0)
    {
        throw new ArgumentException("The count is greater than the number of available values.");
    }

    // 使用数组存储可用数字
    int[] availableNumbers = new int[legalCount];
    for (int i = 0; i < legalCount; i++)
    {
        availableNumbers[i] = start + i;
    }

    int[] numbers = new int[count];

    // 正确的洗牌算法
    for (int i = 0; i < count; i++)
    {
        // 从 [i, legalCount) 范围随机选择一个索引
        int tempIndex = UnityEngine.Random.Range(i, legalCount);

        // 将随机选到的数字存入结果数组
        numbers[i] = availableNumbers[tempIndex];

        // 将选中的数字移到已选区域(位置 i)
        availableNumbers[tempIndex] = availableNumbers[i];
    }

    return numbers;
}

猜你喜欢

转载自blog.csdn.net/R3333355726856/article/details/142330695