Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Función para número aleatorio no repetido en C# (Unity 4.6)

Iniciado por Ítizhor, 13 de Enero de 2016, 11:06:29 PM

« anterior - próximo »

Ítizhor

¡Hola!

Veréis, desarrollando mi segundo videojuego para Android he llegado a la necesidad de repartir cuatro números (0, 1, 2 y 3, los cuatro primeros elementos de un array) de forma aleatoria y sin que ninguno se repita. Estuve mirando cómo hacerlo y finalmente me decanté por crear un array auxiliar que fuese guardando todos los valores que ya han salido para, al ir a obtener un nuevo número aleatorio, comprobar si el saliente ya ha aparecido y, en tal caso, repetir la búsqueda. Tras terminar, un bucle for se encarga de "vaciar" los elementos del array para el siguiente uso. Para ello he creado una función, que ha quedado tal que así:

int NonRepeatedRandomNumber ()
{
   do
   {
      randomCS = Random.Range (0, 3);
   }
   while (randomCS == positionedCCSS[0] || randomCS == positionedCCSS[1] || randomCS == positionedCCSS[2]);

   return randomCS;
}


Todas las variables, randomCS (el número aleatorio buscado en cada operación) y positionedCCSS[] (el array auxiliar) están declarados fuera de la propia función, al inicio del script. Huelga decir que ambas son de tipo int. También cabe comentar que el bucle for que vacía el array auxiliar tampoco está dentro de la función.

El caso es que he ido comprobando poco a poco el código, comentando distintas partes de forma secuencial para eliminar posibles fuentes de error y mi problema solo aparece cuando entra en juego la función: Unity se congela, como cuando entra en funcionamiento un bucle infinito (lo que me lleva a pensar que puede ser algo relacionado con el bucle do-while, aunque no consigo ver qué).

Un saludo y gracias de antemano.

[EX3]

José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Ítizhor

¡Hola!

Disculpas por la extrema tardanza, pero no he vuelto por aquí antes. ¡Funcionó! De hecho, aquella misma noche ajusté el código y todo salió como tenía previsto. ¡Gracias! A ti por la respuesta y a Darago_malaga por la ayuda  :D.

Un saludo,
Ítizhor.

darorck

Yo lo que suelo hacer en estos casos, salvo que la lista de numeros sea muy grande es crear una lista con todos los numeros, ordenarla aleatoriamente y luego ir dropeando numeros desde el final de la lista.
No se como hacerlo en C# pero no tiene que ser muy complicado aplicar el concepto.

En python 2.6 seria algo asi:

import random
mylist = range(100)
random.shuffle(mylist)

#Y luego para ir sacando numeros con
aleatorio = mylist.pop()






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.