Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: alicesimu on November 05, 2016, 05:44:36 PM

Title: La funcion de: RAND acepta numeros tipo FLOAT???
Post by: alicesimu on November 05, 2016, 05:44:36 PM
Buenas

es posible que la funcion de numeros aleatorios, funcionara con FLOAT??

seria algo asi:

RAND(0.2,2.0);

Devolverá un numero en coma flotante entre:  0.2 -2.0

0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
1.1
...
2.0

Creo que seria asi.

pero para solucionar eso: hago esto
en número enteros:
y me devolviera en coma flotante, decimales...
private
float val;
begin
val=RAND(2,20);
Val=val/10;
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: SplinterGU on November 06, 2016, 08:12:57 AM
solo enteros...
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: alicesimu on November 06, 2016, 12:23:23 PM
Quote from: SplinterGU on November 06, 2016, 08:12:57 AM
solo enteros...
juuu

bueno con el tema de dividir /10, /100 en la variable tipo float, lo soluciono.

es decir si hacemos:
varfloat=RAND(10,100);
varfloat=varfloat/100;
obtendremos números con decimales del: 0,1 hasta 1.0

si queremos mas decimales: (+1 decimal mas, para tener mas precision)
varfloat=RAND(100,1000);
varfloat=varfloat/1000;
obtendremos números con decimales del: 0,10 hasta 1.00

añadir 0 sucesivamente.
se obtiene mayor precision, mas suavizado.
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: DCelso on November 06, 2016, 02:56:52 PM

Aqui tienes la función hecha en bennu

De camino te pego la función de tiempo que necesitas en el otro lado, ya que rand para que sea rand usa esa como semilla;


import "mod_video"
import "mod_key"
import "mod_map"
import "mod_proc"
import "mod_grproc"
import "mod_text"
import "mod_file"   
import "mod_string" 
import "mod_regex"
import "mod_time"
import "mod_rand"
import "mod_say"
import "mod_math"


float  randf(minval,maxval,precision)
private
  float value;
begin
    value = pow(10,precision);
    return rand(minval*value,maxval*value)/value;
end

global
  int i;
begin
    rand_seed(time());
    for (i = 0; i< 10;i++)
        say(randf(10,20,4));
       
    end
    say(ftime("%d-%m-%Y %H:%M:%S",time()));
end

Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: alicesimu on November 07, 2016, 10:00:05 AM
Debo probar tu test!!

muy interesante el codigo!!!

creia que la Semilla aleatoria la selecionaba automaticamente, sin declarar la funcion RAND_SEED.(que no es necesaria llamarla, como has echo tu)
que la coje de la hora del S.O. y la secuencia de numeros RAND siempre seria diferentes.
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: panreyes on November 07, 2016, 10:05:43 AM
La verdad es que no sería mala idea incluirla en PixTudio o BennuGD2.

¿Por qué no se la proponéis a Joseba en bitbucket? :)
https://bitbucket.org/josebagar/pixtudio/issues?status=new&status=open
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: alicesimu on November 07, 2016, 11:05:06 AM
Quote from: panreyes on November 07, 2016, 10:05:43 AM
La verdad es que no sería mala idea incluirla en PixTudio o BennuGD2.

¿Por qué no se la proponéis a Joseba en bitbucket? :)
https://bitbucket.org/josebagar/pixtudio/issues?status=new&status=open

Oh! vaya, creo que AUN no lo probe realmente el RAND ,si de verdad da la misma sequencia de numeros, cada vez que ejecutamos el programa.

tengo dudas, no me fije y me confie, daba por echo que da la secuencia de numeros diferentes, ya que la semilla aleatoria se setea por la hora(segundos totales) de forma automatica, ya integrada en el motor BennuGD, sin que tu debas declararla al inicio de tu programa.

Lo de reportar cosas allí, debe ser en ingles?? yo es que apenas se escribir ingles  :'(
usaria el traductor google tarzan xDDD
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: alicesimu on November 07, 2016, 11:55:14 AM
Quote from: DCelso on November 06, 2016, 02:56:52 PM

Aqui tienes la función hecha en bennu

De camino te pego la función de tiempo que necesitas en el otro lado, ya que rand para que sea rand usa esa como semilla;


import "mod_video"
import "mod_key"
import "mod_map"
import "mod_proc"
import "mod_grproc"
import "mod_text"
import "mod_file"   
import "mod_string" 
import "mod_regex"
import "mod_time"
import "mod_rand"
import "mod_say"
import "mod_math"


float  randf(minval,maxval,precision)
private
  float value;
begin
    value = pow(10,precision);
    return rand(minval*value,maxval*value)/value;
end

global
  int i;
begin
    rand_seed(time());
    for (i = 0; i< 10;i++)
        say(randf(10,20,4));
       
    end
    say(ftime("%d-%m-%Y %H:%M:%S",time()));
end




16.1245
15.9566
18.138399
18.566
15.3447
18.8855
17.4487
16.758301
11.1688
13.9006


Has puesto que la precision sea de 4 decimales..... por que a veces, da 3 a 6 decimales??
16.758301
18.138399
18.566
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: Drumpi on November 07, 2016, 01:22:19 PM
float numero;
numero = 7.0;
numero = numero / 2;

¿Esto no debería devolver 3? :D Lo digo porque siempre, para obtener un valor float en una división, ambos valores deberían ser float, es decir:
numero = numero / 2.0;

Respecto al número de decimales, es algo que va intrínseco con el formato float: los ceros a la derecha de los decimales se descartan. De lo contrario, todos los floats deberían representarse con el mismo número, y ya te confirmo que iban a ser muyyy largos dado que la base tiene algo menos de 32bits (depende del número de bits que se guarden para la mantisa :D ).

Respecto a la precisión de POW... Supongo que tiene que ver en que realmente no se hace una raiz a la hora de calcular, sino una operación llamada "serie de Fourier", que no es más que una suma de un número ilimitado de fracciones, que siguen una serie para su generación.
Cuantas más fracciones se sumen, más precisa será la operación.
Si quieres tener una precisión de 4 decimales, a lo mejor tienes que sumar 7 fracciones, pero te puede dar un resultado con 45 decimales. Lo que importa es que los primeros 4 decimales te dan un valor exacto, mientras que el resto pueden no ser precisos, es decir, que obtienes un número que tiene un margen de error de +-0.00005.

...o simplemente que hay algo raro en la librería y está ignorando el número de decimales que le pasas, no lo sé :D

(Me apetecía dar una clase de matemáticas computacionales básica :P).
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: DCelso on November 07, 2016, 09:30:55 PM
fallo de precisión de los floats, tienes que aguantarte. Herencia de C.
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: alicesimu on November 16, 2016, 09:34:45 AM
si es curioso, pero gracias igualmente.

observacion: como puedes declarar una funcion?? si no dice si es una funcion o proceso
solo le tienes declarado como tipo float(que es el valor de retorno que debe dar)

float RAND_float(...)
private
...
begin
...
end

:o :o
cuando lo vi fue un LOL.

curiosamente al colocarlo debajo del process main();
deja de devolver tipo float la variable... la devuelve es entera....  :o otro LOL.


No entiendo bien que pasa....
por que lo declaras por encima del process main();???
y no dices si se trata de tipo function??

es la primera vez que veo eso.
que alguien me explique que pasa? como permite declarar asi las funciones? y porque funcionan bien si se pone por encima del process main, y dejan de funcionar bien si estan por debajo?
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: SplinterGU on November 16, 2016, 12:22:47 PM
ya se lo explique DCelso hace 1 o 2 dias, en el hilo del -Caa
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: Drumpi on November 16, 2016, 06:52:42 PM
Porque lo toma como PROCESO. Recuerda que para que una función devuelva un float la fórmula es

function float mi_funcion (parametros de entrada)
private
    float dato_a_devolver
begin

    return dato_a_devolver;
end


Nos empeñamos en seguir las fórmulas de DIV, que son extremadamente flexibles y de alto nivel, sin preocuparnos de hacer lo que aprendimos en clases de programación con C, en un nivel más bajo y con control absoluto de lo que hacemos :D
Cuando empiecen los punteros, y se nos olvide la inicialización, verás que risa con los ventanazos de error de Windows/Linux, o cuando se cierre sin avisar por una función con punteros que escribimos hace cuatro días, verás :D

(No va por tí, Alicesimu,... solamente LOOOL).
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: SplinterGU on November 16, 2016, 09:27:30 PM
Quote from: Drumpi on November 16, 2016, 06:52:42 PM
Porque lo toma como PROCESO. Recuerda que para que una función devuelva un float la fórmula es

function float mi_funcion (parametros de entrada)
private
    float dato_a_devolver
begin

    return dato_a_devolver;
end


Nos empeñamos en seguir las fórmulas de DIV, que son extremadamente flexibles y de alto nivel, sin preocuparnos de hacer lo que aprendimos en clases de programación con C, en un nivel más bajo y con control absoluto de lo que hacemos :D
Cuando empiecen los punteros, y se nos olvide la inicialización, verás que risa con los ventanazos de error de Windows/Linux, o cuando se cierre sin avisar por una función con punteros que escribimos hace cuatro días, verás :D

(No va por tí, Alicesimu,... solamente LOOOL).

no es eso, es porque la declara despues de su uso...
Title: Re:La funcion de: RAND acepta numeros tipo FLOAT???
Post by: SplinterGU on November 16, 2016, 09:28:41 PM
codigo correcto


import "mod_video"
import "mod_key"
import "mod_map"
import "mod_proc"
import "mod_grproc"
import "mod_text"
import "mod_file"
import "mod_string"
import "mod_regex"
import "mod_time"
import "mod_rand"
import "mod_say"
import "mod_math"

//declaracion
declare float  randf(minval,maxval,precision) end


global
  int i;
begin
    rand_seed(time());
    for (i = 0; i< 10;i++)
        say(randf(10,20,4));

    end
    say(ftime("%d-%m-%Y %H:%M:%S",time()));
end

float  randf(minval,maxval,precision)
private
  float value;
begin
    value = pow(10,precision);
    return rand(minval*value,maxval*value)/value;
end