У меня есть случай, когда мне нужно выбрать случайный элемент, но я не знаю общего количества элементов и не хочу создавать огромный массив, а затем выбирать элемент. Например, вот что у меня сейчас:
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, я использую новый элемент в качестве выбранного элемента, если не просто игнорирую его. По мере увеличения общего количества предметов вероятность выбора каждого нового предмета соответственно уменьшается.
Является ли этот метод «хорошим»? Это так же «случайно», как создание массива и выбор элемента позже? Это так быстро, как это может быть? Пожалуйста, направьте меня через мое невежество в случайных числах. :)