Подтвердить что ты не робот

Выбор случайной строки из массива

Как я могу выбрать случайную строку из моего массива, но не выбирать один и тот же дважды.

string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };

Возможно ли это? Я думал об использовании

return strings[random.Next(strings.Length)];

Но у этого есть возможность вернуть одну и ту же строку дважды. Или я ошибаюсь? Должен ли я использовать что-то вроде List для этого. Любая обратная связь приветствуется.

4b9b3361

Ответ 1

Самый простой способ (но медленный для больших списков) - использовать контейнер с изменяемым размером, например List, и удалить элемент после его выбора. Как:

var names = new List<string> { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };

int index = random.Next(names.Count);
var name = names[index];
names.RemoveAt(index);
return name;

Когда ваш список пуст, все значения были выбраны.

Более быстрый способ (особенно если ваш список длинный) заключается в использовании алгоритма перетасовки в вашем списке. Затем вы можете вывести значения по одному за раз. Это было бы быстрее, потому что удаление с конца List обычно намного быстрее, чем удаление из середины. Что касается перетасовки, вы можете посмотреть этот вопрос для более подробной информации.

Ответ 2

Попробуйте этот код ниже

string[] Titles = { "Excellent", "Good", "Super", "REALLY GOOD DOCTOR!", "THANK YOU!", "THE BEST", "EXCELLENT PHYSICIAN", "EXCELLENT DOCTOR" };

comments_title.Value=Titles[new Random().Next(0,Titles.Length) ] ;

Ответ 3

Вы можете перетасовать массив на первом шаге, а затем просто перебрать перетасованный массив.
Это имеет то преимущество, что O (n) по сравнению с O (n ^ 2) реализованы на основе RemoveAt. Конечно, это не имеет большого значения для коротких массивов.

Отметьте Jon Skeet ответ на следующий вопрос о хорошем (все заказы одинаково вероятны) реализация shuffe: Использует Random и OrderBy хороший алгоритм тасования?

Ответ 4

Самое лучшее, что вам нужно сделать, это просто создать дубликат списка, а затем, когда вы произвольно выбираете строку, вы можете удалить ее из дублированного списка, чтобы вы не могли выбрать ее дважды.

Ответ 5

Логика, которую вы можете использовать, следующая:

1) Выберите случайное целое число в диапазоне, равном длине вашего массива. Вы можете сделать это, используя класс System.Random.

2) Используйте строку, соответствующую индексу массива

3) Удалите элемент с этим индексом из массива (может быть проще со списком)

Затем вы можете выбрать снова, и одна и та же строка не появится. Массив будет на один элемент короче.

Ответ 6

Вам нужно будет отслеживать те, которые вы использовали, желательно в List, если вы не хотите/не можете изменить исходный массив. Используйте цикл while, чтобы проверить, что он не был использован, а затем добавьте его в список "used".

Ответ 7

//SET LOWERLIMIT
cmd = new SqlCommand("select min(sysid) as lowerlimit from users", cs);
int _lowerlimit = (int) cmd.ExecuteScalar();
lowerlimit = _lowerlimit;

//SET UPPERLIMIT
cmd = new SqlCommand("select max(sysid) as upperlimit from users", cs);
int _upperlimit = (int) cmd.ExecuteScalar();
upperlimit = _upperlimit;

//GENERATE RANDOM NUMBER FROM LOWERLIMIT TO UPPERLIMIT
Random rnd = new Random();
int randomNumber = rnd.Next(lowerlimit, upperlimit+1);

//DISPLAY OUTPUT
txt_output.Text += randomNumber;

Ответ 8

Использовать следующий метод утилиты

public static class ListExtensions
{
    public static T PickRandom<T>(this List<T> enumerable)
    {
        int index = new Random().Next(0, enumerable.Count());
        return enumerable[index];
    }
}

Затем вызовите метод ниже

string[] fruitsArray = { "apple", "orange"};
string inputString = fruitsArray.ToList().PickRandom();