反復しない乱数アルゴリズムの生成が興味深い

6628 ワード

実際の作業ではランダムな重複しない配列を生成する必要がある.次の2つのアルゴリズムがある.
/// <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]++;

            }

        }

    }

}

最初のバージョンは、分かりにくいですが、実現できます.
 
 
もう1つのより理解しやすいバージョン
/// <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];

    }

}