Случайный индекс значения в массиве - PullRequest
3 голосов
/ 27 февраля 2020

В моей программе есть функция, которая находит ближайший индекс к целому числу.

var indexWinnder = Array.IndexOf(scoreArray, nearestScore)

Но способ, которым работает Array.IndexOf, заключается в том, что он находит первое совпадение и использует его. Я хочу случайный индекс. Не первый. не последний Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Для этого нет встроенного метода, но вы можете использовать свой собственный метод. Мой пример использует обобщенную c версию возможной реализации.

class Program
{
    static void Main(string[] args)
    {
        var arr = new int[] { 1, 2, 3, 1, 1, 5, 2, 6, 1 };

        var randomIndex = RandomIndexOf(arr, 1);

        Console.WriteLine(randomIndex);
        Console.ReadKey();
    }

    static int RandomIndexOf<T>(ICollection<T> arr, T element)
    {
        var indexes = arr.Select((x, i) => new { Element = x, Index = i })
            .Where(x => element.Equals(x.Element))
            .Select(x => x.Index)
            .ToList();

        if (indexes.Count == 0) // there is no matching elements
        {
            return -1;
        }

        var rand = new Random();
        var randomIndex = rand.Next(0, indexes.Count);

        return indexes[randomIndex];
    }
}
0 голосов
/ 27 февраля 2020

Может быть, что-то вроде этого вам нужно:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        int[] sampleArray = new int[] { 1, 2, 3, 2, 1, 3, 1, 2, 3 };

        var indices = getAllIndices(sampleArray, i => i == 2);
        var rnd = new Random();
        var i = rnd.Next(0, indices.Count());
        var randomIndex = indices.ElementAt(i);

        Console.WriteLine(randomIndex);
        Console.ReadLine();
    }

    static IEnumerable<int> getAllIndices(int[] array, Predicate<int> predicate)
    {
        for (var i = 0; i < array.Length; i++)
        {
            if (predicate(array[i]))
                yield return i;
        }
    }
}

HTH

Обновление

Не забудьте проверить наличие пустых массивов, нулевых аргументов и т. Д. c.

0 голосов
/ 27 февраля 2020

Я не знаю, правильно ли я понял вашу проблему, но если вы просто хотите получить случайный индекс, вы можете написать метод и использовать:

Random rnd = new Random();
int index = rnd.Next(MinValue, MaxValue); // e.g: MinValue: 0, MaxValue: Length of the Array

, а затем просто использовать этот индекс в качестве индекса массива.

Случайный вариант - не лучший вариант, если вы действительно хотите случайный, потому что он следует заданному шаблону c, который будет повторяться снова и снова и снова. Если вы хотите что-то еще более случайное, вы можете посмотреть в RNGCryptoServiceProvider: https://www.dotnetperls.com/rngcryptoserviceprovider. Надеюсь, это поможет!

...