¿Cómo extraer valores aleatorios de una lista y usarlos como texto de botones?

publicado por: Anonymous

Necesito que un Random escoja un valor de un List. Despues de que lo escoge lo remueve del List para que no se repita, pero cuando va por el sexto random me aparece algo asi:

(Argument was Out of Range Exception) Index was out of range. Must be non-negative and less than the size of the collection.

        List<string> botones = new List<string>();

        botones.Add("Filipenses 4:13");
        botones.Add("Juan 3:16");
        botones.Add("2da Timoteo 3:16-17");
        botones.Add("Salmos 23:6");
        botones.Add("Salmos 91:1");
        botones.Add("Romanos 5:1");


    {

        Random r1 = new Random();
        indexBtn = r1.Next(botones.Count);
        txtBtn = botones[indexBtn];
        botones.RemoveAt(indexBtn);

        Random r2 = new Random();
        indexBtn2 = r2.Next(botones.Count);
        txtBtn2 = botones[indexBtn2];
        botones.RemoveAt(indexBtn2);

        Random r3 = new Random();
        indexBtn3 = r3.Next(botones.Count);
        txtBtn3 = botones[indexBtn3];
        botones.RemoveAt(indexBtn3);

        Random r4 = new Random();
        indexBtn4 = r4.Next(botones.Count);
        txtBtn4 = botones[indexBtn4];
        botones.RemoveAt(indexBtn4);
       botones.RemoveAt(indexBtn4);

        Random r5 = new Random();
        indexBtn5 = r5.Next(botones.Count);
        txtBtn5 = botones[indexBtn5];
        botones.RemoveAt(indexBtn5);


       Random r6 = new Random();
       indexBtn6 = r6.Next(botones.Count);
       txtBtn6 = botones[indexBtn6];
       botones.RemoveAt(indexBtn6);



        Btn.Text = txtBtn;
        Btn2.Text = txtBtn2;
        Btn3.Text = txtBtn3;
        Btn4.Text = txtBtn4;
        Btn5.Text = txtBtn5;
        Btn6.Text = txtBtn6;


    }

solución

Es porque has repetido botones.RemoveAt(indexBtn4) 2 veces por error.

 botones.RemoveAt(indexBtn4);
botones.RemoveAt(indexBtn4);

… de modo que estás tratando de remover más elementos de los que tienes en la lista.

Para evitar este tipo de error, hubiera sido mejor emplear un ciclo para no repetir la lógica tantas veces.

Problema con Random

Un problema secundario que noto es que creas una nueva instancia de Random a cada vez que necesitas obtener un valor aleatorio. Esto no es correcto. La razón es que la instancia de Random se inicializa usando el reloj de la computadora. De modo que si creas varias instancias de Random muy rápidamente, todas te van a generar el mismo valor.

En tu caso, no es tan grave, ya que el intervalo de valores que le pides es diferente a cada vez. Pero bajo otras circunstancias no funcionaría tal como lo piensas.

Ejemplo de código simplificado

Usando tu misma lógica, aquí tienes una forma de simplificar tu código que te ayudará a evitar defectos menores:

List<string> botones = new List<string>();
botones.Add("Filipenses 4:13");
botones.Add("Juan 3:16");
botones.Add("2da Timoteo 3:16-17");
botones.Add("Salmos 23:6");
botones.Add("Salmos 91:1");
botones.Add("Romanos 5:1");

List<string> txtBtn = new List<string>();
Random rnd = new Random();

while (botones.Count != 0)
{
    int index = rnd.Next(botones.Count);
    txtBtn.Add(botones[index]);
    botones.RemoveAt(index);
}

Btn.Text = txtBtn[0];
Btn2.Text = txtBtn[1];
Btn3.Text = txtBtn[2];
Btn4.Text = txtBtn[3];
Btn5.Text = txtBtn[4];
Btn6.Text = txtBtn[5];
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *