Random

Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

X-Trader,


Supongo que el código que me has compartido lo has copiado de la siguiente página web:

Un simple generador de números aleatorios.

El código está escrito en Pascal.
Pero lo extraño es que la variable "a" no se usa para nada. ¿Por qué la define?
La Int() es una función parte entera.

Los displays del código son:
7
8
6
2
4
8
6
2
4
...
...
...

Es decir números pseudoaleatorios de un dígito.

Yo necesito 4 dígitos.
Bueno, es un punto de partida.
Pero, como te he dicho, no entiendo porque define la variable "a".

Y, sea cual sea el algoritmo, necesito una semilla que sea aleatoria. En el código que nos has compartido, la semilla es 0,1, la cual no es aleatoria.

X-Trader, lo que busco no es lo que propones pero no se aleja mucho de lo que propones.
Por ahí va la cosa.

Otra cosa que no entiendo porque elige 147. ¿Tiene alguna propiedad especial el número 147?
147 ni es primo, ni es número de Fibonacci, ... ¿Qué tiene de especial 147 para usarlo para generar números aleatorios?



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Random

Mensaje por X-Trader »

Rafa7 escribió: 18 Abr 2018 11:35X-Trader,


Supongo que el código que me has compartido lo has copiado de la siguiente página web:

Un simple generador de números aleatorios.

El código está escrito en Pascal.
Pero lo extraño es que la variable "a" no se usa para nada. ¿Por qué la define?
La Int() es una función parte entera.

Los displays del código son:
7
8
6
2
4
8
6
2
4
...
...
...

Es decir números pseudoaleatorios de un dígito.

Yo necesito 4 dígitos.
Bueno, es un punto de partida.
Pero, como te he dicho, no entiendo porque define la variable "a".

Y, sea cual sea el algoritmo, necesito una semilla que sea aleatoria. En el código que nos has compartido, la semilla es 0,1, la cual no es aleatoria.

X-Trader, lo que busco no es lo que propones pero no se aleja mucho de lo que propones.
Por ahí va la cosa.

Otra cosa que no entiendo porque elige 147. ¿Tiene alguna propiedad especial el número 147?
147 ni es primo, ni es número de Fibonacci, ... ¿Qué tiene de especial 147 para usarlo para generar números aleatorios?



Saludos.
En efecto lo he sacado de ahí. La "a" está claro que sobra.

Lo del 147 no es por nada en particular, es un punto de partida como otro cualquiera.

Y si necesitas obtener decimales simplemente no multipliques por 10 (elimina showmessage(Floattostr(X * 10));)

De todos modos te he hecho una simulación en Excel, a ver qué te parece.

Saludos,
X-Trader
Adjuntos
PseudoAleatorio.xlsx
(11.86 KiB) Descargado 176 veces
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Rango Starr
Mensajes: 3842
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

. :D
Última edición por Rango Starr el 18 May 2021 19:13, editado 2 veces en total.
un ciclo y otro ciclo, son un biciclo...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....

..y nada mas...
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Gracias, X-Trader.



El Excel que has aportado me parece tiene un poco de lío. En un lugar usas 0,1 y en otro 0,01. Lo que no sé es si lo haces expresamente o si es una errata. ¿La intención es usar 0,1 o es usar 0,01? ¿o expresamente usas 0,1 y 0,01?

Cuando tenga tiempo le doy unas vueltas al Excel que has aportado.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Rango Starr escribió: 18 Abr 2018 13:10Rafa ,

vas por buen camino...

sumale a los 86400 segundos que tiene un dia, el dia del mes, el mes multiplicado por 40, y el año.
con ello, tendras una secuencia unica.

coge un numero primo, multiplicalo por un numero de base diez que te lo acerque a 100.000, y dividelo por la suma de los numeros anteriores ( 86400 +d +m*40+año).

como es un numero primo, te dara un decimal con una buena ristra de numeros detras de la coma..... quitale la parte entera y los primeros decimales, (eso te lo dejo a ti, si no te aclaras lo explico), luego, la parte decimal que te quede, multiplicala por 10000, y coge la parte entera... ya tendras tu pseudo-aleatorio, de secuencia unica. es reproducible, pero puesto que cada divisor es diferente del resto, no existira una secuencia que se te repita. Como no se para que lo quieres pues la explicacion es un poco a burro barra...

Saludos!

EDITO.- Se me habia olvidado comentar que si la secuencia de generacion de los numeros del divisor, es menor de 1 segundo, los numeros se te repetiran asi, que o bien mediante un bucle de gasto de tiempo, o bien sumandole en la serie de iteraciones -1 al numero del divisor, en cada iteracion, entonces te genera una secuencia pseudoaleatoria, que en este caso, ya no sera unica, pero sera de repeticion testimonial...
Gracias, Rango.



Por encima esta interesante tu aporte.
Pero ahora no tengo tiempo digerirlo.

Me llama la atención lo del 40. ¿No sería mejor 30 o 31? ¿Por qué 40?
Precisamente no quise a ir a dia del mes y año, porque no sabía que hacer, tomar 30, 31, 29, 28 ... Y al final desistí.

Ya volveré a leer tu aporte cuando tenga más tiempo.



Saludos.
Última edición por Rafa7 el 18 Abr 2018 14:54, editado 1 vez en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

Avatar de Usuario
X-Trader
Administrador
Mensajes: 12781
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Random

Mensaje por X-Trader »

Rafa7 escribió: 18 Abr 2018 13:16Gracias, X-Trader.

El Excel que has aportado me parece tiene un poco de lío. En un lugar usas 0,1 y en otro 0,01. Lo que no sé es si lo haces expresamente o si es una errata. ¿La intención es usar 0,1 o es usar 0,01? ¿o expresamente usas 0,1 y 0,01?

Cuando tenga tiempo le doy unas vueltas al Excel que has aportado.

Saludos.
Era 0.01 en ambos lados pero vamos, que da un poco igual, puedes considerar 147 y 0.1 semillas y a partir de ahí variarlo usando 0.01. De todos modos te he actualizado el Excel para no liarse. La idea es al final es calcular la resta quitando la parte entera y sumar una cantidad pequeña, no tiene mayor historia y lo bueno es que el cálculo en términos computacionales apenas consume recursos.

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Rango Starr
Mensajes: 3842
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 18 May 2021 19:03, editado 1 vez en total.
un ciclo y otro ciclo, son un biciclo...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....

..y nada mas...
Rango Starr
Mensajes: 3842
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 18 May 2021 19:03, editado 1 vez en total.
un ciclo y otro ciclo, son un biciclo...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....

..y nada mas...
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

Rango Starr escribió: 18 Abr 2018 15:43 mas sencillo, al time que calculas , sumarle o bien los ticks del activo , o bien los volumenes que se van generando del activo....
Hola, Rango Starr.



Generar una series de números pseudoaleatorios es muy fácil puedes usar cualquier cosa, como por ejemplo, lo que mencionas (ticks, volúmenes, etc ...). Lo que es difícil (solo un poco difícil) es generar una serie de números pseudoaleatorios que tengan una distribución uniforme. En una distribución uniforme de números pseudoaleatorios entre cero y uno, la probabilidad de que el primer dígito sea 4, es la misma probabilidad de que el primer dígito sea 9, etc ... No sé si me explico. Si generamos números pseudoaleatorios con una distribución normal, por ejemplo, no me sirve, la serie de números pseudoaleatorios debe de tener una distribución homogénea.

Me temo que sumar ticks o volumenes, si sería "aleatorio" pero no tendría una distribución homogénea. Probablemente tienen otro tipo de distribución, por ejemplo, lognormal.

Hay que hilar muy fino porque aletoriedad no implica distribución uniforme. No me sirve cualquier tipo de aletoriedad, solo me sirve la uniforme, y además que tenga un periodo de ciclo suficientemente largo.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Rango Starr
Mensajes: 3842
Registrado: 22 Dic 2014 10:49

Re: Random

Mensaje por Rango Starr »

.
Última edición por Rango Starr el 18 May 2021 19:01, editado 1 vez en total.
un ciclo y otro ciclo, son un biciclo...
si añadimos otro ciclo, entonces tendremos "un triciclo"... famoso trio catalan de humor de los 90....

..y nada mas...
Avatar de Usuario
Rafa7
Mensajes: 4919
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Random

Mensaje por Rafa7 »

X-Trader escribió: 18 Abr 2018 14:53
Rafa7 escribió: 18 Abr 2018 13:16Gracias, X-Trader.

El Excel que has aportado me parece tiene un poco de lío. En un lugar usas 0,1 y en otro 0,01. Lo que no sé es si lo haces expresamente o si es una errata. ¿La intención es usar 0,1 o es usar 0,01? ¿o expresamente usas 0,1 y 0,01?

Cuando tenga tiempo le doy unas vueltas al Excel que has aportado.

Saludos.
Era 0.01 en ambos lados pero vamos, que da un poco igual, puedes considerar 147 y 0.1 semillas y a partir de ahí variarlo usando 0.01. De todos modos te he actualizado el Excel para no liarse. La idea es al final es calcular la resta quitando la parte entera y sumar una cantidad pequeña, no tiene mayor historia y lo bueno es que el cálculo en términos computacionales apenas consume recursos.

Saludos,
X-Trader
Gracias, X-Trader.


He modificado tu Excel, añadiendole dos hojas.

Te lo adjunto:

PseudoAleatorio.xlsx
(20.09 KiB) Descargado 184 veces

En la 1a hoja coincide con la hoja de tu Excel.
En la 2ª hoja pongo un código equivalente, que me permite prescindir de una columna. Da exactamente la misma serie que en la 1a hoja.
En la 3a hoja tomo como semilla el current time (1400 * ss + 24 * mm + hh), y como incremental 0,00000001, en lugar de 0,01, para obtener números aleatorios de 8 cifras.
La columna RANDOM sería la serie de números pseudoaleatorios de 8 cifras.

Como hh tiene 24 valores (del 0 al 23), ss y mm, se han de multiplicar por 24.
Como mm tiene 60 valiores (del 0 al 59), ss se ha de multiplicar por 60.
Por lo tanto ss se ha de multiplicar por 24 * 60, o sea por 1400.
De ahi sale 1400 * ss + 24 * mm + hh.

He supuesto, equivocada o acertádamente, no lo sé, que disminuyendo el incremental conseguimos series aleatorias de más dígitos. Me conformo con 8 dígitos, que es la precisión mínima de una calculadora (no recuerdo ninguna calculadora que yo haya tenido que tenga una precisión inferior).

El problema es saber si la serie de números que se genera con este algoritmo tendrá una distribución uniforme, y, en caso de que sea de ciclo periódico, si el período de ciclo es suficientemente largo.

¿Qué te parece?



Saludos.
Última edición por Rafa7 el 19 Abr 2018 15:04, editado 1 vez en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Random

Mensaje por mascara »

Hola,

Por si te sirve. He hecho un programa basándome en el código de una función que existe en el sistema con el que trabajo que da un número aleatorio. He copiado el código, quitando paja para dejarlo más simple y he hecho un programa que hace 100000 ejecuciones sacando números entre 0 y 10, y parece que los resultados siempre se distribuyen bastante bien entre todos los números posibles... tanto aumentando el rango de posibles valores o aumentando/disminuyendo el número de ejecuciones...
El algoritmo en sí no te lo sé explicar matemáticamente, porque no soy matemático y esas cosas se me escapan, pero creo que da buenos resultados, a menos que yo tenga algún error (cambiando el tipo de datos de ran_int y l_ran_int se puede hacer que funcione con resultados decimales...):

Código: Seleccionar todo

CONSTANTS
  lc_faktor TYPE p VALUE 86400. "= 24 * 60 * 60
DATA:
  lc_ran_a(4)  TYPE p  VALUE 67301,        "Multiplikator
  lc_ran_m(6)  TYPE p  VALUE 4294967296,   "Modulus 2**32
  lc_ran_c(1)  TYPE p  VALUE 01.           "Inkrement

*TYPE int4 significa que es un número entero...
*Rango de valores entre los que estará el resultado
DATA: ran_int_max TYPE int4 VALUE 10,
      ran_int_min TYPE int4 VALUE 0.

DATA: ran_int   TYPE int4. "TYPE p decimals 4. para hacerlo con números decimales...
DATA: l_ran_int TYPE int4. "TYPE p decimals 4. para hacerlo con números decimales...

*Si esto lo pongo como entero el WHILE se convierte en un bucle infinito!
*Supongo que porque al redondearse a entero deja de cumplir la condición del WHILE
data: l_ran_number TYPE p DECIMALS 4."int4.

DATA ran_seed TYPE p.

DO 100000 TIMES. "Voy a simular 100000 ejecuciones y recopilar el resultado en una tabla para ver si los resultados se distribuyen homogéneamente...

  l_ran_int = ran_int_min - 1.

*-- Der Bereich wird für die Berechnung erweitert, um
*   Randeffekte zu unterdrücken. Nicht gewünschte
*   Ergebnisse werden geskipt.
  WHILE l_ran_int > ran_int_max OR l_ran_int < ran_int_min.
*-- Zufallszahl zwischen 0 und 1 erzeugen
    IF ran_seed = 0.

      ran_seed = sy-datum * lc_faktor + sy-uzeit. "Inicializa el seed. sy-datum es la fecha en formato AAAAMMDD y sy-uzeit es la hora en formato HHMMSS
      ran_seed = ran_seed MOD lc_ran_m.

    ENDIF.

    ran_seed = ( ran_seed * lc_ran_a + lc_ran_c ) MOD lc_ran_m.

    IF ran_seed = 0. "Supongo que esto es sólo por seguridad por si el ran_seed se queda a cero, pero no creo que vaya a pasar eso nunca...
      MOVE lc_ran_m TO ran_seed.
    ENDIF.

    l_ran_number =  ran_seed / lc_ran_m.
*-- Zufallszahl auf den gewünschten Bereich transformieren
    l_ran_int = l_ran_number * ( ran_int_max - ran_int_min + 2 ) + ran_int_min - 1.
  ENDWHILE.

  MOVE l_ran_int TO ran_int. "valor obtenido!

* Esto es para luego imprimir una tabla con los resultados...
  t_resultados-numero = ran_int.
  t_resultados-apariciones = 1.
  COLLECT t_resultados.
ENDDO.

*Esto es para imprimir una tabla con los resultados...
SORT t_resultados.
LOOP AT t_resultados.
  AT FIRST.
    WRITE: /1 'Número', 20 'Apariciones'.
  ENDAT.
  WRITE: /1 t_resultados-numero, 20 t_resultados-apariciones.
ENDLOOP.
Resultado 100.000 ejecuciones:

Código: Seleccionar todo

Número             Apariciones
                  0     9.088
                  1     9.111
                  2     8.952
                  3     9.021
                  4     9.216
                  5     8.970
                  6     9.144
                  7     9.226
                  8     9.065
                  9     9.064
                 10    9.143
1000 ejecuciones:

Código: Seleccionar todo

Número             Apariciones
                  0        91
                  1        88
                  2        81
                  3        83
                  4        83
                  5        95
                  6        81
                  7        98
                  8       105
                  9       107
                 10        88
100 ejecuciones

Código: Seleccionar todo

Número             Apariciones
                  0         9
                  1        12
                  2        11
                  3         6
                  4        12
                  5         8
                  6         8
                  7        10
                  8         9
                  9         6
                 10         9
Saludos,
azinc
Mensajes: 4
Registrado: 08 Mar 2018 14:52

Re: Random

Mensaje por azinc »

Perdonar mi ignorancia, que uso le podeis dar a una sucesión de números pseudo-aleatorios con distribución uniforme?
He visto el Excell y ok,...de hecho se podría intentar que se fuesen actualizando
Del programa no puedo opinar aunque por curiosidad también me gustaría sabe en que lenguaje esta escrito
Supongo que tiene que ver con intentar demostrar la robusted de un sistema ¿?
Pasar buen día
Avatar de Usuario
mascara
Mensajes: 344
Registrado: 18 Oct 2007 23:15

Re: Random

Mensaje por mascara »

Está hecho en ABAP (el lenguaje de los sistemas SAP). No es pseudocódigo, pero como sólo son un par de bucles y unas fórmulas, prácticamente es pseudocódigo...
azinc
Mensajes: 4
Registrado: 08 Mar 2018 14:52

Re: Random

Mensaje por azinc »

Ok muchas gracias
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Indicadores”