在实际工作中需要产生一个随机的不重复的数组.有如下两个算法.
/// <summary> /// 产生一个不重复的 在0-count之间的随机数组 /// 但是包含所有0-count之间的数值 /// </summary> /// <param name="Buffers"></param> /// <param name="Count"></param> public static void GenerateRandomOrder( Int32[] Buffers, Int32 Count ) { Int32[] Numbers = new Int32[Count]; Random rnd1 = new Random(); for (Int32 i = 0; i < Count; i++) { Numbers[i] = rnd1.Next(Int32.MaxValue);//产生一个随机数 Buffers[i] = 0; for (Int32 j = 0; j < i; j++)//每循环一次都可以获得0-i之间的随机数组! { //相当于Numbers排序 //那个下标的数值大,获得的++的潜力越大 //最后buffers获得的数值,对应于相同下标Numbers的排序结果 所以Buffers中数值 //的范围是不会超出Index的 if (Numbers[i] >= Numbers[j])//如果当前随机数比之前产生的随机数大的话 { Buffers[i]++; } else { Buffers[j]++; } } } }
第一个版本,比较难理解,不过可以实现.
另外一个更好理解的版本
/// <summary> /// 产生一个不重复的 在0-count之间的随机数组 /// 但是包含所有0-count之间的数值 /// 这个版本容易理解一点 /// </summary> /// <param name="Buffers"></param> /// <param name="Count"></param> public static void NGenerateRandomOrder( Int32[] Buffers, Int32 Count ) { List<Int32> Ranlist = new List<Int32>(Count); List<Int32> result = new List<Int32>(Count); Random rander = new Random(); for (Int32 i = 0; i < Count;i++ ) { Ranlist.Add(i); } int index = 0; int value = 0; for (Int32 i = 0; i < Count;i++ ) { index = rander.Next(0, Ranlist.Count);//随机选取一个index value = Ranlist[index]; result.Add(value); Ranlist.RemoveAt(index);//删除一个value 这样子, //value就不会再重复出现了 实现了随机数的目的 } for (Int32 i = 0; i < Count;i++ ) { Buffers[i] = result[i]; } }