Выберите N случайных элементов из массива в C#

В этом примере создается общий метод расширения, который позволяет вам легко выбирать N случайных объектов из массива. Например, он позволяет выбрать 5 элементов из массива, содержащего 10 имен.

Выбор одного случайного элемента из массива очень просто. Просто используйте объект Random, как показано на примере Выберите случайные объекты из массива в C# .

Вы можете немного расширить эту идею, но есть осложнения. Например, если вы произвольно выбираете второй элемент, что произойдет, если вы снова выберете тот же элемент? Самым простым решением было бы использовать следующий элемент, но это увеличило бы шансы выбора следующего элемента (от 1 до N до 2 в N). И что, если элемент, который вы выбрали дважды, является последним элементом, поэтому нет следующего элемента? Вещи становятся еще более беспорядочными, если вам нужно выбрать больше предметов.

Лучший подход - рандомизировать массив элементов, а затем выбрать первый N из них. Фактически, вы можете сэкономить некоторое время, когда вы только рандомизировали первые N элементов.

В следующем коде показан способ расширения PickRandom, который делает это, и класс RandomTools, который его определяет.

public static class RandomTools
{
    // Случайный объект, используемый этим методом.
    private static Random Rand = null;

    // Возвращает случайные значения num_items.
    public static List PickRandom(
        this T[] values, int num_values)
    {
        // Создаем объект Random, если он не существует.
        if (Rand == null) Rand = new Random();

        // Не превышайте длину массива.
        if (num_values >= values.Length)
            num_values = values.Length - 1;

        // Создаем массив индексов 0 по значениям. Длина - 1.
        int[] indexes =
            Enumerable.Range(0, values.Length).ToArray();

        // Создаем возвращаемый список.
        List results = new List();

        // Рандомизировать первые индексы num_values.
        for (int i=0; i

Класс сначала определяет приватную переменную типа Random. Он использует этот объект для генерации случайных чисел, когда он им нужен.

Далее класс определяет метод расширения PickRandom. & lt; T & gt; после имени метода указывает, что это общий метод, который принимает один общий параметр, который в этом методе называется T.

Ключевое слово this указывает, что это метод расширения, который расширяет переменную, которая следует за ним. В этом случае он расширяет массив типа T.

Сначала метод проверяет переменную Rand и инициализирует ее, если она null.

Далее код гарантирует, что num_values не больше длины массива. Например, вы не можете выбрать 10 элементов из массива, содержащего 5 элементов.

Чтобы сделать свой выбор, метод должен рандомизировать элементы. Но я не хочу испортить первоначальный заказ предметов. Чтобы избежать этого, вместо этого метод создает массив, содержащий индексы элементов, а затем рандомизирует часть этого массива. Затем он может использовать рандомизированные индексы для выбора элементов.

Алгоритм вызывает метод Enumerable.Range, чтобы составить список значений между 0 и значениями. Length - 1. Он вызывает метод ToArray результата для преобразования списка в массив.

Далее код создает List & lt; T & gt; для хранения возвращаемых значений метода.

Затем код вводится в цикл, где i проходит от 0 до num_values. Для каждого значения i метод выбирает индекс случайных массивов между i и концом массива. Затем он меняет индекс в этой позиции со значением в позиции i.

Код также добавляет выбранный элемент в список results. Он использует выбранное значение в indexes [i], чтобы выбрать значение из исходного массива T.

После того, как он выполнил все свои выборки, метод возвращает список results.

Обратите внимание, что этот метод похож на тот, который используется в примере Создавать методы расширения, которые рандомизируют массивы и списки в C# , за исключением того, что он останавливается, когда у него рандомизировано достаточно элементов.

Следующий код показывает, как основная программа использует этот метод.

// Выберите некоторые элементы.
private void btnPick_Click(object sender, EventArgs e)
{
    int num_values = int.Parse(txtNumSelections.Text);
    txtResults.Lines =
        txtNames.Lines.PickRandom(num_values).ToArray();
}

Этот код сначала получает количество элементов для выбора, num_values. Затем он использует свойство txtNames элемента управления Lines для получения строк текста, введенных в TextBox слева. Он вызывает метод расширения PickRandom для массива строк, чтобы сделать желаемое количество выборов.

Источник: http://csharphelper.com/blog/2015/01/select-n-random-items-from-an-array-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector