ここに投稿された他のアルゴリズムは均一なシャッフルを生成しないため、シャッフル アルゴリズムの正しい実装を投稿しています。
他の回答が述べているように、少数の値をランダム化するには、配列にそれらの値を入力し、配列をシャッフルしてから、必要な数の値を使用するだけです。
以下は、Fisher-Yates Shuffle (別名、Knuth Shuffle) の実装です。(そのリンクの「実装エラー」セクションを読んでください(「反復ごとに有効な配列インデックスの範囲全体から常に j を選択する」を検索してください)、ここに投稿された他の実装の何が問題なのかについての議論を参照してください。)
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
static class Program
{
static void Main(string[] args)
{
Shuffler shuffler = new Shuffler();
List<int> list = new List<int>{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
shuffler.Shuffle(list);
foreach (int value in list)
{
Console.WriteLine(value);
}
}
}
/// <summary>Used to shuffle collections.</summary>
public class Shuffler
{
public Shuffler()
{
_rng = new Random();
}
/// <summary>Shuffles the specified array.</summary>
/// <typeparam name="T">The type of the array elements.</typeparam>
/// <param name="array">The array to shuffle.</param>
public void Shuffle<T>(IList<T> array)
{
for (int n = array.Count; n > 1; )
{
int k = _rng.Next(n);
--n;
T temp = array[n];
array[n] = array[k];
array[k] = temp;
}
}
private System.Random _rng;
}
}