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 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);//0 1
// 将随机选到的数字存入结果数组
numbers[i] = availableNumbers[tempIndex];
// 将选中的数字移到已选区域(位置 i),下次循环会来到后一个位置
availableNumbers[tempIndex] = availableNumbers[i];
}
return numbers;
}