有趣的产生不重复随机数算法

时间:2022-10-20 09:50:39

在实际工作中需要产生一个随机的不重复的数组.有如下两个算法.

/// <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];
    }
}