后续继续维护
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;
}