Tengo un caso en el que tengo que seleccionar un elemento al azar, pero no sé el número total de elementos y no quiero construir un gran conjunto luego elige un objeto. Por ejemplo, esto es lo que tengo en este momento:Seleccione un elemento al azar, sin saber el número total de elementos
List<string> items;
while (true)
{
string item = GetNextItem();
if (item == null)
break;
}
int index = random.GetNext(0, items.count);
Como se puede ver, estoy construyendo una colección gigantesca que realmente no necesito, sólo necesito un número aleatorio entre 0 y el número de artículos. Aquí es lo que estoy pensando en hacerlo, y funciona, pero me gustaría saber si alguno de los expertos por ahí puede encontrar un fallo con él:
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;
}
}
Esto me da a mi número de índice, y el ítem seleccionado al azar. Mi pensamiento detrás de esto es que cuando hay 3 ítems totales, por ejemplo, selecciono un número aleatorio entre 0 y 2 (inclusive) y si es igual a 2 utilizo el nuevo ítem como ítem seleccionado, si no es que simplemente lo ignoro. A medida que aumenta el número total de elementos, la posibilidad de que se seleccione cada nuevo elemento disminuye en consecuencia.
¿Este método es "bueno"? ¿Es tan "aleatorio" como construir la matriz y elegir un elemento más tarde? ¿Es tan rápido como puede ser? Por favor, guíame a través de mi ignorancia en números aleatorios. :)
@Sky Sanders: publicación del sábado por la noche ... – Randolpho
LOL - publicación tarde en la noche para Por supuesto. :) Tengo un bucle infinito que sigue tirando elementos de una fuente hasta que se devuelve un elemento nulo. Necesito elegir uno de esos elementos al azar. –
Creo que has usado 'contar' cuando te refieres a 'total' en tu segundo bloque de código –