iRobb 776 Report post Posted February 10, 2020 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
Igor 337 Report post Posted February 11, 2020 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 Share this post Link to post Share on other sites
iRobb 776 Report post Posted February 11, 2020 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
Igor 337 Report post Posted February 11, 2020 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
francoe1 536 Report post Posted February 11, 2020 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(); } Share this post Link to post Share on other sites
iRobb 776 Report post Posted February 12, 2020 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
francoe1 536 Report post Posted February 12, 2020 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