Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Unity Crear una matriz o list de elementos aleatorios que no se repitan

Vamos con un poco de código que seguro, que ha mas de uno le ha dado quebraderos de cabeza.

Objetivo: Crear una función que nos permita extraer elementos aleatorios y que estos no se repitan.

Lenguaje: Unity C#

Primero declararemos
int [] indicesArray = new int[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
List auxiliar_indices = new List();

El Array indicesArray contiene los numeros que queremos que salgan.
List es un superarray es decir, un objeto tipo List que tiene sus propias funciones que nos ayudaran a gestionar los Arrays.
Para usar los List debeis tener importada la libreria using System.Collections.Generic
using System.Collections.Generic;

Ojo: Cuando declaramos el List hacemos una llamada al constructor, que no se os olviden () al final.

Ahora necesitamos pasarle nuestra matriz al List.

En la funcion Star() o el Awake le pasaremos nuestros indices.

auxiliar_indices.AddRange(indicesArray);

Ahora vamos con la función que es muy sencilla, para entenderla bien tenemos que pensar en lo que estamos tratando de crear, queremos que la función nos devuelva de forma aleatoria uno de los elementos de la matriz, pero que si la llamamos mas veces ese numero no se repita, podriamos tomar dos caminos, podríamos sacar el numero aleatorio y guardarlo en otro Array o List , así cuando sacásemos el siguiente comprobaríamos primero si esta en el Array auxiliar y si no esta lo guardamos, el problema de este sistema es que tendremos que evaluar muchas veces.
La segunda opcion es pensando como funciona el mundo real, si tengo un bombo con 16 numeros, saco un numero y simplemente no lo vuelvo a meter en la siguiente tirada o lo elimino del bombo, este proceso va descartando paulatinamente hasta que sólo queda un numero en el bombo.
Llevado a C# seria:

public int GetUnicoAleatorio(){

int rand = Random.Range(0, auxiliar_indices.Count);
int value = auxiliar_indices[rand];
auxiliar_indices.RemoveAt(rand);
return value;
}
Extra en indice aleatorio con Random.Range(0, auxiliar_indices.Count);
Lo almacenamos en value
Sacamos la bola del bombo eliminando el indice con RemoveAt
Finalmente devolvemos la bola extraída.
Os dejo todo el código, con un ejemplo que se podría hacer más genérico para conseguir extraer elementos aleatorios de un Array sin repetir ninguno:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Bombo : MonoBehaviour {
int [] indicesArray = new int[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
List auxiliar_indices = new List();

void Start () {

auxiliar_indices.AddRange(indicesArray);
}
public int GetUnicoAleatorio(){

int rand = Random.Range(0, auxiliar_indices.Count);
int value = auxiliar_indices[rand];
auxiliar_indices.RemoveAt(rand);
return value;
}
void Extraebolas(int bolas){
for (int i=0; i<bolas; i++) {
Debug.log(GetUnicoAleatorio());
}
}
}

Espero que os haya servido de ayuda.

Leave a Reply

Your email address will not be published. Required fields are marked *