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

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

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

    }

}

你可能感兴趣的:(随机数)