直接上代码:
原理是首先生成好 0 - total 的连续基础数据,然后再随机取其中的一个,再把最后一个数字复制到已经被取的数字的位置,再次生成随机数的时候不包括基础数据的最后一个,以此类推。
/// <summary>
/// 生成 [0,total) 的随机数
/// </summary>
/// <param name="total">最大随机数</param>
/// <returns>IList<int></returns>
private static IList<int> GetRandomSequence(int total)
{
List<int> listBase = new List<int>();
List<int> listOutput = new List<int>();
for (int i = 0; i < total; i++)
{
listBase.Add(i);
}
Random random = new Random();
for (var i = listBase.Count - 1; i >= 0; i--)
{
var index = random.Next(i);
listOutput.Add(listBase[index]);
listBase[index] = listBase[i];
}
return listOutput;
}
原理是首先生成好 0 - total 的连续基础数据,然后再随机取其中的一个,再把最后一个数字复制到已经被取的数字的位置,再次生成随机数的时候不包括基础数据的最后一个,以此类推。
下面是网上找的源码:
链接:点击打开链接
public static int[] GetRandomSequence2(int total)
{
int[] sequence = new int[total];
int[] output = new int[total];
for (int i = 0; i < total; i++)
{
sequence[i] = i;
}
Random random = new Random();
int end = total - 1;
for (int i = 0; i < total; i++)
{
int num = random.Next(0, end + 1);
output[i] = sequence[num];
sequence[num] = sequence[end];
end--;
}
return output;
}