[ Foro de C# ]
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!!!
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.
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;
}
}
}
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
Si gracias a todos!!!
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.)