Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: fab62 en Septiembre 20, 2012, 10:22:42 PM

Título: Elegir un elemento aleatorio con probabilidad
Publicado por: fab62 en Septiembre 20, 2012, 10:22:42 PM
Creador : Fab62


Versión de GM :  :GM8:


Descripción : Elije un elemento al azar, puede ser un string, como también un valor real. lo hace con probabilidad, ya que repite el elemento tantas veces en una lista como se indica, y finalmente se elije al azar con todos los elementos que tiene.


Funcionamiento :

Forma del argumento

El script tiene una forma para que se realice su proceso de la manera correcta, posee solo un argumento que se debe asignar de la forma siguiente:

scr_elegir_probable(string):
string = "A%3,2.5%3,3B%5*"

donde lo que se asigna antes del símbolo "%" va a ser el elemento que quieres que se agregue a la lista,
y lo que sigue de este símbolo hasta la "," tiene que ser un valor numérico, y éste indica la cantidad de veces
que se repite el elemento en la lista, el string debe terminar siempre con el símbolo *.


Proceso

El script va de acuerdo al siguiente orden:


1.- Creación de variables principales
2.- Recorrer el string principal
3.- Reconocer caracteres antes del símbolo "%" y guardarlos en una variable
4.- Reconocer caracteres después del símbolo "%" y guardarlos en una variable hasta llegar a ","
5.- Agregar el elemento a la lista tantas veces como se le asignó
6.- Volver de nuevo al ciclo hasta llegar a un "*"
7.- Elegir aleatoriamente en la lista un elemento.
8.- Observar el tipo de elemento: si es un string o un valor real  y retornar según el tipo.



Script: Se utiliza en un solo tiempo, igual como las funciones choose, random... lo bueno es que no se
limita a 16 argumentos  :D

 
  /***************************************************
    scr_elegir_probable(string)
   ***************************************************/
   
  /*
  p = string de la forma:
  ABC%N, DEF%M,HIJ%O*
  donde ABC es un string de cualquier cantidad de caracteres, %N es el multiplicador del string y lo repite N         veces en la lista
  * es el termino, debe colocarse siempre al final
  */
 
  // Asigacion y creacion de variables locales
  var p, lista, det_p;
  p     = argument0
  lista = ds_list_create()
  det_p = 0;
 
  string_reconocido = ""
  string_multiplicador = ""
  repartir = 0
 
  // recorrer el string
  for (i = 1; i <= string_length(p)+1; i += 1)
  {
   if string_char_at(p,i) != "," and string_char_at(p,i) != "*"
   {
    if !(det_p)
    {
     if string_char_at(p,i) != "%"
     {string_reconocido += string_char_at(p,i)}
     else {det_p = 1}
    }
    else {string_multiplicador += string_char_at(p,i)}
   }
   else
   {
    while repartir < real(string_multiplicador)
    {
    ds_list_add(lista,string_reconocido)
    repartir += 1
    }
    string_reconocido    = ""
    string_multiplicador = ""
    repartir             = 0
    det_p                = 0
   }
  }
 
  // elegir un elemento de la lista
  resultado = ds_list_find_value(lista,irandom(ds_list_size(lista)-1))
 
  // observar el tipo de elemento
  if (string_digits(resultado) != "0" && string_letters(resultado) != "")
  || ((string_digits(resultado) == "0" && string_letters(resultado) != ""))
  {return resultado}
  else
  {return real(resultado)}



Ejemplo :
si tienes como string "A%5,5E%10,20%6" se creará una lista de esta forma:
[A,A,A,A,A,5E,5E,5E,5E,5E,5E,5E,5E,5E,5E,20,20,20,20,20,20]
y se elegirá un elemento de esa lista aleatoriamente.

si sale A o 5E será un string, si sale 20 será un valor real.
lo hice porque no me gustaba la idea de que la función choose fuera limitada a 16 argumentos XD.
Título: Re:Elegir un elemento aleatorio con probabilidad
Publicado por: Mgbu en Septiembre 20, 2012, 11:22:20 PM
Muy bueno, es muy util, ojala lo hubiera tenido antes :P