反復しない乱数アルゴリズムの生成が興味深い
6628 ワード
実際の作業ではランダムな重複しない配列を生成する必要がある.次の2つのアルゴリズムがある.
最初のバージョンは、分かりにくいですが、実現できます.
もう1つのより理解しやすいバージョン
/// <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];
}
}