La funcion de: RAND acepta numeros tipo FLOAT???

Started by alicesimu, November 05, 2016, 05:44:36 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

alicesimu

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;

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

alicesimu

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.

DCelso


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

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

alicesimu

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.

panreyes

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

alicesimu

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

alicesimu

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

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

fallo de precisión de los floats, tienes que aguantarte. Herencia de C.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

alicesimu

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?

SplinterGU

ya se lo explique DCelso hace 1 o 2 dias, en el hilo del -Caa
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2