Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

3 objetos random

Iniciado por iRobb, Febrero 10, 2020, 11:33:22 PM

Tema anterior - Siguiente tema
Tengo que colocar tres objetos en tres casillas (0, 1, 2) y quiero que siempre sea random. ¿Cual sería la mejor manera óptima por código? Yo ya tengo una idea. A ver que proponéis.

solo tres elementos?
 
quizas hacerlo con "random" y con "if"
 
para casos con mas elementos suelo hacer una "list" con todos los elementos y hago un bucle "for"... entonces, en el bucle, con "random" elijo uno delos elementos y asigno donde sea y le hago "remove" de la list...entonces ese elemento ya no esta en la list...  y sigue el bucle escojiendo al azar elementos de la lista y quitandolos de ella...
 
pero solo para tres seria mejor hacer algo asi;
 

int seleccion1 = Random.Range(0,3);
int seleccion2 = Random.Range(0,2);
if (seleccion2 >= seleccion1)  {
    seleccion2 += 1;
}
int seleccion3 = 0;
if (seleccion3 >= seleccion2) {
    seleccion2 += 1;
}
if (seleccion3 >= seleccion1) {
    seleccion3 += 1;
}

 
....
 
aunque no se si esto era una duda tuya real o era un ejercicio para nosotros... o para los noobs...
 
si quieres borro mi respuesta para que la gente haga el ejercicio

Lo necesitaba hacer y pensé también como ejercicio. La de la lista que propones es la que he utilizado.
 
 

en cuanto a tiempo de ejecucion sera mas rapida la opcion que te he puesto en codigo (la de los "if") ...pero queda mas chula y entendible la de la "list"

Es recomendable utilizar una extensión de IList que soluciones el problema, no por rendimiento, si no para mantener orden y que el código se más fácil de leer. 
 

public static class System.Generic
{
    public static void Shuffle<T>(this IList<T> list)  
    {  
        Random random = new Random();  
        int n = list.Count;  
        for(int i= list.Count - 1; i > 1; i--)
        {
            int rnd = random.Next(i + 1);
            T value = list[rnd];  
            list[rnd] = list[i];  
            list[i] = value;
        }
    }
}

 
De este modo puede utilizar la extensión en cualquier lista dentro del código.
 

private void SetData(List<Item> items)
{
items.Shuffle();
}

 
 

Ostras, que buena manera @francoe1. Mucho más elegante que ir haciendo remove de una list. Así no hay que crear la list cada vez con el contenido.

Cita de: iRobb date=1581489493Ostras, que buena manera @francoe1. Mucho más elegante que ir haciendo remove de una list. Así no hay que crear la list cada vez con el contenido.
   


Aparte es aplicable a IList y IArray lo cual lo hace bastante versátil, es muy importante pensar en GC, por esa razón el objeto random lo cambiaría por Random.Range de Unity. Sacarlo como un propiedad de la clase no debería de funcionar, hasta donde se, es improbable que random repita un valor

Etiquetas: