Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: AnaPE en Noviembre 13, 2015, 09:21:04 PM

Título: Aleatorios sin repetir
Publicado por: AnaPE en Noviembre 13, 2015, 09:21:04 PM
hola, buen día! Estoy programando un juego en el que los números no se debe repetir una vez que la función Random.range los haya escogido, sin embargo ya realice luchas formas y no funciona, o cuando creo q va a funcionar "Unity deja de responder" y tengo q reiniciar el programa.Les dejo el código que utilizo, agradecería mucho su ayuda, saludos. function generarAleatorios(){
   
        Debug.Log("long usados" + usados.length);
        if (usados.length==0){
            elegido=Random.Range(0,4); //no seria voz.length-1?? 
            usados.push(elegido);
        }else{
            elegido=Random.Range(0,4); //no seria voz.length-1?? 
            for (var i=0; i<=usados.length-1; i++){
                if(usados == elegido){
                    indicador=true;
                }
            }
            if(indicador){
                generarAleatorios();
            }else{
                usados.push(elegido);
                Debug.Log("Usados: "+usados);
                Debug.Log("long usados" + usados.length);
            }
        }
}
Título: Aleatorios sin repetir
Publicado por: iRobb en Noviembre 13, 2015, 09:50:05 PM
En la ayuda (http://docs.unity3d.com/ScriptReference/Random.Range.html) (http://docs.unity3d.com/ScriptReference/Random.Range.html)) no se aclaran si el max es inclusive o no. Primero dicen sí y luego no.Por lo que creo recordar, el max es exclusive.Por otro lado, solamente una vez no los tiene que repetir? Lo digo porqué al final te quedarás sin números posibles o el tiempo de proceso será largo para conseguir el que quieres. No sería más recomendable "ayudar" al proceso a acotar? Es decir, cambiar el range en base a los resultados obtenidos, si los escogidos ya están en los límites.También utilizarlo en una coroutine para que "alivie" el proceso sería recomendable, aunque no la podrás hacer recursiva.
Título: Aleatorios sin repetir
Publicado por: Quel en Noviembre 13, 2015, 10:41:16 PM
[quote author=AnaPE" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34417" data-ipsquote-contentcommentid="123452 date=1447446064]hola, buen día! Estoy programando un juego en el que los números no se debe repetir una vez que la función Random.range los haya escogido, sin embargo ya realice luchas formas y no funciona, o cuando creo q va a funcionar "Unity deja de responder" y tengo q reiniciar el programa.[/quote]Hay muchas formas de hacer una secuencia de números aleatorios sin repeticiones. Una de ellas podría ser ... :
1- Generas una List con todos lo valores posibles que se puedan generar.
2- Haces un Random entre esos elementos.
3- Una vez elegido un elemento, lo borras de la lista.
4- Volver al punto 2, mientras queden elementos en la lista. 
Título: Aleatorios sin repetir
Publicado por: AnaPE en Noviembre 14, 2015, 06:21:57 AM
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34417" data-ipsquote-contentcommentid="123453">En la ayuda ([quote author=Quel" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34417" data-ipsquote-contentcommentid="123455 date=1447450876] ¿ Como que no se aclaran ?. Si esta clarísimo y tiene mucho sentido esa forma de hacerlo.Dependiendo de los parámetros que le pases a la función Random, esta actúa de una forma u otra.
Cuando haces un Random de enteros <int>, el max es exclusivo. En otras palabras. un Random.Range(0,10) de va a devolver un valor entre 0 y 9. Porque el 10 es exclusivo.
Cuando haces un Random de punto flotante <float>, el mas es inclusivo. En otras palabras, hacer un Random.Range(0f, 1f) de va a devolver un numero entre 0.0 y 1.0.Hay muchas formas de hacer una secuencia de números aleatorios sin repeticiones. Una de ellas podría ser ... :
1- Generas una List con todos lo valores posibles que se puedan generar.
2- Haces un Random entre esos elementos.
3- Una vez elegido un elemento, lo borras de la lista.
4- Volver al punto 2, mientras queden elementos en la lista. [/quote]Muchas gracias! He intentado mil maneras, gracias por el aporte, se escucha interesante! Saludos
Título: Aleatorios sin repetir
Publicado por: kaito en Noviembre 14, 2015, 10:07:50 AM
He creado una clase genérica para crear barajas de diferentes tipos(gameobjects, numeros, texto, etc...), para seleccionar valores aleatorios no repetidos: 
using UnityEngine;
using System.Collections;

public class BarajaScript : MonoBehaviour {

public class Baraja<T>{

   T[] baraja;
   System.Collections.Generic.List<T> valores;
   System.Random random = new System.Random();

   public Baraja(T[] valores){

      this.baraja = valores;
      this.Reset();

   }

   public void Reset(){

      this.valores = new System.Collections.Generic.List<T>(this.baraja);

   }

   public T Get(){

      if(this.valores.Count > 0){

         int temp = random.Next(this.valores.Count);
         T valor = this.valores[temp];
         this.valores.RemoveAt(temp);
         return valor;

      }

      return default(T);

   }

   public int Count{

      get { return this.valores.Count; }

   }

}

//Barajas de datos(matrices)
public GameObject[] Baraja_GameObjects;
public int[] Baraja_numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
public string[] Baraja_letras = { "UNO", "DOS", "TRES", "CUATRO" };

//Objetos Barajas
Baraja<GameObject> bGameObjects;
Baraja<int> bNumeros;
Baraja<string> bTexto;


// Use this for initialization
void Start () {

   //Crear Barajas con Matrices
   this.bGameObjects = new Baraja<GameObject>(this.Baraja_GameObjects);
   this.bNumeros = new Baraja<int>(this.Baraja_numeros);
   this.bTexto = new Baraja<string>(this.Baraja_letras);

}

void Update(){

   //Seleccionar valores aleatorios, no repetidos, al pulsar tecla
   if(Input.GetKeyDown(KeyCode.Space)){

      if(this.bGameObjects.Count>0) Debug.Log(this.bGameObjects.Get().name);

   }

   if(Input.GetKeyDown(KeyCode.Return)){

      if(this.bNumeros.Count>0) Debug.Log(this.bNumeros.Get());

   }

   if(Input.GetKeyDown(KeyCode.Backspace)){

      if(this.bTexto.Count>0) Debug.Log(this.bTexto.Get());

   }

}   

}
 
Título: Aleatorios sin repetir
Publicado por: AnaPE en Noviembre 17, 2015, 03:49:14 AM
[quote author=Quel" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34417" data-ipsquote-contentcommentid="123455 date=1447450876] ¿ Como que no se aclaran ?. Si esta clarísimo y tiene mucho sentido esa forma de hacerlo.Dependiendo de los parámetros que le pases a la función Random, esta actúa de una forma u otra.
Cuando haces un Random de enteros <int>, el max es exclusivo. En otras palabras. un Random.Range(0,10) de va a devolver un valor entre 0 y 9. Porque el 10 es exclusivo.
Cuando haces un Random de punto flotante <float>, el max es inclusivo. En otras palabras, hacer un Random.Range(0f, 1f) de va a devolver un numero entre 0.0 y 1.0.Hay muchas formas de hacer una secuencia de números aleatorios sin repeticiones. Una de ellas podría ser ... :
1- Generas una List con todos lo valores posibles que se puedan generar.
2- Haces un Random entre esos elementos.
3- Una vez elegido un elemento, lo borras de la lista.
4- Volver al punto 2, mientras queden elementos en la lista. [/quote]Me sirvio!! muchas Gracias