Я отправляю правильную реализацию алгоритма перетасовки, так как другой, опубликованный здесь, не создает равномерного тасования.
Как и в другом ответе, для небольшого числа значений, которые должны быть рандомизированы , вы можете просто заполнить массив этими значениями, перетасовать массив, а затем использовать любое количество значений, которые вы хотите.
Ниже приведена реализация Fisher-Yates Shuffle
g0] (также известный как Knuth Shuffle). (Прочитайте раздел «ошибки реализации» этой ссылки (найдите «всегда выбирая j из всего диапазона допустимых индексов массива на каждой итерации»), чтобы увидеть некоторое обсуждение того, что не так с другой реализацией, размещенной здесь.)
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
static class Program
{
static void Main(string[] args)
{
Shuffler shuffler = new Shuffler();
List list = new List{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
shuffler.Shuffle(list);
foreach (int value in list)
{
Console.WriteLine(value);
}
}
}
/// Used to shuffle collections.
public class Shuffler
{
/// Creates the shuffler with a as the random number generator.
public Shuffler()
{
_rng = new Random();
}
/// Shuffles the specified array.
/// The type of the array elements.
/// The array to shuffle.
public void Shuffle(IList 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;
}
}