Jump to content
Sign in to follow this  
iRobb

3 objetos random

Recommended Posts

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.

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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"

Share this post


Link to post
Share on other sites

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();
}

 

  • Like 2

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
3 hours ago, iRobb said:

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.

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

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...