Jump to content
Sign in to follow this  
AnaPE

Aleatorios sin repetir

Recommended Posts

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

Share this post


Link to post
Share on other sites

En la ayuda (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.

Share this post


Link to post
Share on other sites

En la ayuda (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.

¿ 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.

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.

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.

 

Edited by Quel

Share this post


Link to post
Share on other sites

En la ayuda (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.

Muchas gracias! lo tendre en cuenta!

 

¿ 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.

 

Muchas gracias! He intentado mil maneras, gracias por el aporte, se escucha interesante! Saludos

Share this post


Link to post
Share on other sites

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

		}

	}	

}

 

Edited by kaito

Share this post


Link to post
Share on other sites
 

¿ 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.

 

Me sirvio!! muchas Gracias

Share this post


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

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...