"New Neural" es un proyecto de motor de red neuronal de código abierto para la plataforma MetaTrader 5. - página 44

 
Urain:

Una clase de PRNG en el rango especificado.

Ventajas: posibilidad de tener varios aleatorios con diferente inicialización,

distribuido uniformemente valores de cualquier rango hasta 10 lm (desafortunadamente, no se puede obtener más que eso en un array).

Para 10 lakh calls Rand() supera a un rand estándar en 50 µs (tiempo rnd.Rand()=344 tiempo rand()=391).

Desventajas: Srand() tarda mucho tiempo en inicializarse, el rango estándar es 32768 (766µs), 1 lakh casi 2 minutos.

No he comprobado el límite de 10 lakhs, pero debe ser increíblemente largo porque el tiempo crece progresivamente.


Se acepta la sana crítica.



¿Puede explicarlo?

¿Para qué puede necesitar estas funciones?

   uint              control(){return(gcnt-1);};// получить значение счётчика при последнем автоматическом запросе Rand

   uint              Rand(uint i){return(res[i]);};// запрос Rand по указанному i (счётчик не изменяется)

O un pequeño ejemplo de cómo utilizarlos.

¿Qué tiene de malo el estándar?

 
her.human:

¿Puede explicar esto?

¿Para qué pueden ser necesarias estas funciones?

   uint              control(){return(gcnt-1);};// получить значение счётчика при последнем автоматическом запросе Rand

   uint              Rand(uint i){return(res[i]);};// запрос Rand по указанному i (счётчик не изменяется)

O un pequeño ejemplo de cómo utilizarlos.

¿Qué tiene de malo el estándar?

Estas funciones pueden ser necesarias para simplemente copiar parte o toda una secuencia aleatoria, o para obtener valores que han sido emitidos en ciertas llamadas a Rand().

Rand() es insatisfactorio en muchos aspectos:

1) Si se quiere obtener una secuencia uniformemente distribuida de 0 a 100, no se puede obtener directamente de la norma (hay que modificar el algoritmo).

2) No es posible utilizar dos secuencias simultáneamente, la inicialización de srand, hace imposible utilizar la inicialización anterior.

3) El rango del rand estándar sólo permite 32768 partes y nada más. Ni siquiera digo de dividirlo por 100000, pero ni siquiera se puede dividir por cualquier múltiplo de 10. Por ejemplo: tienes un rango [-1;1] y necesitas dividirlo en pasos hasta el tercer dígito, inicializa la clase al rango 2000, entonces

Rand()/1000.-1.

y obtener el PRNG del rango [-1;1] en pasos de 0,001.

No se puede hacer esto con el estándar.

 
¿Quién? ¿Qué? Dime, ¿hay alguna otra forma de optimizar la tarea?
 
Urain:

Estas funciones pueden ser necesarias para simplemente copiar parte o toda una secuencia aleatoria o para recuperar valores que han sido emitidos en ciertas llamadas a Rand().

El stanndprt es insatisfactorio en muchos aspectos:

1) Si se quiere obtener una secuencia uniformemente distribuida de 0 a 100, no se puede obtener directamente de la norma (hay que modificar el algoritmo).

2) Es imposible utilizar dos secuencias simultáneamente, la inicialización de srand, hace imposible utilizar la inicialización anterior.

3) El rango del rand estándar permite hacer la división en 32768 partes solamente y de ninguna otra manera. Ni siquiera hablo de dividirlo en 100000, sino que no podrás dividirlo en ningún múltiplo de 10. Por ejemplo, tienes un rango [-1;1] y necesitas dividirlo en pasos con la precisión del tercer signo, por lo que necesitas inicializar la clase al rango de 2000.

y obtener el PRNG del rango [-1;1] con paso 0.001

No se puede hacer esto con el estándar.

1) De acuerdo.

2) ¿No está claro? ¿Para qué puede necesitarlo?

3) No me he metido mucho en el código, parece que se refiere al 1).

Por eso tengo una pregunta sobre estas dos funciones (arriba).

Definitivamente necesitas una clase (función) así. Pero nadie necesita frenar innecesariamente.

 

Si tienes problemas para entender el paso 2, tal vez deberías decidir primero por qué necesitas un PRNG en primer lugar.

Entonces quedará claro por qué es necesario tener dos secuencias PRNG no correlacionadas al mismo tiempo.

 
Urain:

Si tienes problemas para entender el paso 2, tal vez deberías decidir primero por qué necesitas un PRNG en primer lugar.

Entonces quedará claro por qué hay dos secuencias PRNG no correlacionadas al mismo tiempo.


Es extraño escuchar que las secuencias PRNG no están correlacionadas.

No entiendo para qué sirven las redes neuronales.

 
humano:

No consigo entender para qué sirven estas redes neuronales.

No hay razón, es sólo una cosa elegante ahora...

Urain:

Ventajas: Posibilidad de tener varios aleatorios con diferente inicialización,

¿Así que cada objeto lleva una secuencia diferente?

Desventajas: Srand() tarda mucho tiempo en inicializarse, el rango estándar es de 32768 (766µs), 1 cordero son casi 2 minutos.

Aquí es donde es realmente, realmente aterrador, poco realista. No debería ser así.

Ya veré cuando haya un poco de espacio.
 
su.humano:

Es extraño escuchar que las secuencias PRNG no están correlacionadas.

No entiendo para qué sirven las redes neuronales.

Te recuerdo, por si lo olvidas, que después de 32768 llamadas a rand (si no lo reinicializas) la secuencia se repite.

En consecuencia, si utilizamos una inicialización para generar dos secuencias paralelas en el tiempo, algunas secciones pueden tener una correlación entre ellas (esto no es obligatorio, pero es una posibilidad).

Las redes tienen diferentes algoritmos, por ejemplo, Montecarlo, o GA, de nuevo cada red con cualquier algoritmo requiere valores iniciales de pesos.

 
TheXpert:

Nada, sólo una cosa elegante en estos días...

1) ¿Así que cada objeto lleva una secuencia diferente?

2) Aquí es donde es realmente, realmente aterrador, poco realista. No debería serlo.

Ya veré cuando haya un pequeño hueco.

1 Sí, cada objeto memoriza una secuencia en srand() y luego da vueltas y vueltas igual que el estándar rand().

2 Ya lo optimicé todo lo que pude; fue peor.

En resumen, para facilitar la solución del problema, describiré lo que he hecho allí:

Después de la preparación, escribimos un array temporal secuencia creciente (valor del contador), a continuación, el generador da un valor del rango renge (este índice se solicita al asignar de temp a res), tan pronto como el valor en el búfer resultante, en un temporal, en este lugar ponemos renge (valor que el generador no puede dar). Los valores se pasan al buffer de res a través de la comprobación, si temp tiene un renge entonces ya hemos asignado este valor a res, entonces hacemos una ordenación rápida(que lleva todos los renge al final del array) y truncamos el rango por el resto de la secuencia no tocada. Luego sigue hasta que toda la res esté llena.

 
Urain:

Si te olvidas, después de 32768 llamadas a rand (si no lo reinicializas) la secuencia se repite.

En consecuencia, si utilizamos una inicialización para generar dos secuencias paralelas en el tiempo, algunas partes pueden tener correlación (no es obligatorio, pero sigue existiendo esa posibilidad).

Las redes tienen diferentes algoritmos, por ejemplo, Montecarlo, o GA, de nuevo cada red con cualquier algoritmo requiere pesos inicializados.

Todo esto es una especulación. No hay pruebas de ello.

He experimentado mucho con GA y tenía tantas dudas que el PRNG hace un bucle (repite). Resultó que no se trataba del carrete... (esto es sobre mí).

Conclusión: el PRNG no afecta al funcionamiento del AG.

Sobre la inicialización:

Hay tal deseo, que es posible inicializar en una elección - por ceros, PRNG, de un archivo.