[ Foro de C# ]

Tombola Random

13-Sep-2015 16:43
Carlos Rodriguez (+1)
5 Respuestas

Imaginemos que tengo un array de 3 objetos y tengo un random que me llama aleatoriamente el index del array:
Ejemplo:


Random R= new Random();
Int index = r.next(3);
string [] arr = new string[3];
arr[0] ="juan";
arr[1] ="pedro"
arr[2]="carlos"
MessageBox.Show(arr[index]);


Ahora si quiero ir eliminado del random o tombola el numero de index que ya salio para que no se repita en el futuro hasta que no quede ninguno en la tombola del random como se haria?
Gracias!!!


14-Sep-2015 10:16
Invitado (Caranim)

Se me ocurren dos opciones:
- Marcar de alguna manera los elementos que ya hayan salido y si el número que genera random pertenece a un elemento que ha sido usado, vuelves a generar otro número nuevo.
- La que yo creo que es mejor:

   total_elementos = índice_mas_alto_del_array
   Mientras total_elementos mayor que cero.
                    elemento_seleccionado = aleatorio entre cero y total_elementos
                    Variable_Auxiliar = array[elemento_seleccionado]
                    array[elemento_seleccionado] = array[total_elementos]
                    array[total_elementos] = Variable_Auxiliar ( Necesario solo si quieres guardar el elemento seleccionado en la tabla )
                    total_elementos = total_elementos -1
  Fin Mientras.
  En este punto, el elemento del array con índice cero debe de ser el único que no has tratado.
 
  Con esto mueves el elemento seleccionado al final del array y al reducir en uno el valor de total_elementos consigues que no pueda volver a ser seleccionado.

Espero que te ayude.

Caranim.


14-Sep-2015 20:45
Carlos Rodriguez (+1)

Encontre otra solucion :
Es usar una lista en vez de un array:
Aqui esta el ejemplo:


namespace Lista
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Random r = new Random();
        static bool start = false;
        public List<string> list = new List<string>();
        private void button1_Click(object sender, EventArgs e)
        {
            if (start == false)
            {
                list.Add("pedro");
                list.Add("carlos");
                list.Add("juan");
            }


            int index = r.Next(0, list.Count());
            MessageBox.Show(Convert.ToString(index));
            MessageBox.Show(list[index]);
            // MessageBox.Show(Convert.ToString(list.Count() + 1));

            // MessageBox.Show(list[1]);
            // MessageBox.Show(Convert.ToString(list.Count()));

            list.RemoveAt(index);
            if (list.Count != 0)
            MessageBox.Show(list[list.Count()-1]);
            else
            MessageBox.Show(Convert.ToString(list.Count()));
            start = true;

        }
    }
}


 


14-Sep-2015 23:24
Nacho Cabanes (+84)

Efectivamente, en una lista puedes usar RemoveAt para borrar un elemento. Si te exigen que uses un array, deberás emplear un "for", tampoco es mucho más difícil:

http://www.nachocabanes.com/csharp/curso2015/csharp04a2.php
 


15-Sep-2015 02:19
Carlos Rodriguez (+1)

Si gracias a todos!!!


16-Sep-2015 10:09
Invitado (Caranim)

Me gusta más tu opción que las mías. Gracias por aportarla.

Un saludo.

Caranim






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)