it-swarm.com.ru

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

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

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

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

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

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

25
atrljoe

Самый простой способ (но медленный для больших списков) - использовать контейнер с изменяемым размером, такой как 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 обычно намного быстрее, чем удаление из середины. Что касается перетасовки, вы можете взглянуть на этот вопрос для более подробной информации.

36
Etienne de Martel

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

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) ] ;
29
Bharat Kumar

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

Проверьте ответ Джона Скита на следующий вопрос для хорошей (все одинаковые вероятности) реализации shuffe: Является ли использование Random и OrderBy хорошим алгоритмом перемешивания?

5
CodesInChaos

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

2
Icemanind

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

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

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

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

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

2
samb8s
//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;
1
devkiat

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

1
Evan Mulawski

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

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();
1
Siddarth Kanted