У меня есть случай, когда мне нужно выбрать случайный элемент, но я не знаю общее количество элементов, и я не хочу создавать огромный массив, а затем выбирать элемент. Например, это то, что я имею прямо сейчас:
List<string> items;
while (true)
{
string item = GetNextItem();
if (item == null)
break;
}
int index = random.GetNext(0, items.count);
Как вы можете видеть, я создаю гигантскую коллекцию, которая мне действительно не нужна, мне просто нужно случайное число между 0 и количеством элементов. Вот что я собираюсь делать, и это работает, но я хотел бы знать, может ли кто-нибудь из экспертов найти ошибку:
int index = -1;
int total;
string selectedItem;
while (true)
{
string item = GetNextItem();
if (item == null)
break;
++total;
int rnd = random.Next(0, total);
if (rnd == total- 1)
{
index = total- 1;
selectedItem = item;
}
}
Это дает мне мой индексный номер и случайно выбранный элемент. Мое мышление в том, что, когда есть 3 общих элемента, например, я выбираю случайное число между 0 и 2 (включительно), и если он равен 2, я использую новый элемент как выбранный элемент, если не просто его игнорировать. По мере того как общее количество предметов увеличивается, каждый новый шанс выбора будет уменьшаться соответственно.
Является ли этот метод "хорошим"? Является ли это "случайным", как создание массива и выбор предмета позже? Это так быстро, как может быть? Прошу вас, по моему невежеству, в случайных числах.:)