Выбор случайной строки из массива
Как я могу выбрать случайную строку из моего массива, но не выбирать один и тот же дважды.
string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
Возможно ли это? Я думал об использовании
return strings[random.Next(strings.Length)];
Но у этого есть возможность вернуть одну и ту же строку дважды. Или я ошибаюсь? Должен ли я использовать что-то вроде List
для этого. Любая обратная связь приветствуется.
Ответы
Ответ 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();