Generación de números aleatorios distribuidos uniformemente (0,1) - página 17

 
//                              From volume 2 Knuth
// rand() = 1.83 seconds Mersenne = 1.01 seconds GameRand = 0.24 seconds
//...........................................................................
// Числа Мерсена:
//p0 = 2147483647,              p1 = 2147483629,         p2 = 2147483587,        p3 = 2147483579,
//p4 = 2147483563,              p5 = 2147483549,        p6 = 2147483543,        p7 = 2147483497,
//p8 = 2147483489,              p9 = 2147483477,        p10 = 2147483423,       p11 = 2147483399,
//p12 = 2147483353,     p13 = 2147483323,       p14 = 2147483269,       p15 = 2147483249,
//p16 = 2147483237,     p17 = 2147483179,       p18 = 2147483171,       p19 = 2147483137,
//p20 = 2147483123,     p21 = 2147483077,       p22 = 2147483069,       p23 = 2147483059,
//p24 = 2147483053,     p25 = 2147483033,       p26 = 2147483029,       p27 = 2147482951,

#define MM 2147483647 // p0, простое число Эвклида (Мерсена),
#define AA 48271      // full-period multiplier, спектральный критерий
#define QQ 44488      //        (long) (MM/AA)
#define RR 3399       //        (long) MM % AA, important RR < QQ

static long int X = 153;
static long int Y = 8479237;
//............................../ RNG_Mersenne \........................
long int RNG_Mersenne (void)
{       long int Z;
        //.......................................................
        //
        // 1  key  making LCG multiplatform fixing
        // overflow problem  multiplying two 32 bit is
        // Schrage solved by the doing approximate factorization of m such that
        // m = aq + r , q = (int)(m/a), r = m mod a
        // xi = a(xi-1 mod q) - r*(int)(xi-1/q)         if xi-1 >= 0
        // xi = a(xi-1 mod q) - r*(int)(xi-1/q) + m    otherwise
        // m=16807 becomes q = 127773 and r = 2836
        //........................................................
        //
        X = AA * (X % QQ) - RR * (long int) (X / QQ);   // Schrage's approximate factorization
        if (X < 0)
                X = X + MM;
//......................................................................
//
// #define MMM 2147483399       // p11, простое число но не Мерсена
#define MMM 2147483629          // prime p1
#define AAA 40692               // спектральный критерий
#define QQQ 52774               // (long) (MMM/AAA)
#define RRR 3791                // (long) MMM % AAA, important RRR < QQQ
        Y = AAA * (Y % QQQ) - RRR * (long) (Y / QQQ);
        if (Y < 0)
                Y = Y + MMM;
        Z = X - Y;
        if (Z < 0)
                Z = Z + MMM;
        return (Z);
}

//............................./ DRNG_Mersenne \.................................
double DRNG_Mersenne (void)
{       return ( (double) RNG_Mersenne () * 4.656612875245796924105750827168 e-10);  // or / 2147483647.0
//      return ( (double) RNG_Mersenne () / 2 147 483 647.0);
}
 
// Tausworthe is a nice option. It gives 2^88 non-repetitive numbers.
// A handful of primitive operations, and extremely good randomness;
static unsigned long int s1 = 1423667, s2 = 2234, s3 = 34567 ; // any non-zero numbers
long int RNG_Tausworthe ()
{       unsigned long int b ;
        b = ( (s1 << 13) ^ s1) >> 19;
        s1 = ( (s1 & 4294967294) << 12) ^ b;
        b = ( (s2 << 2) ^ s2) >> 25;
        s2 = ( (s2 & 4294967288) << 4) ^ b ;
        b = ( (s3 << 3) ^ s3) >> 11 ;
        s3 = ( (s3 & 4294967280) << 17) ^ b ;
        return (s1 ^ s2 ^ s3);
}
// Or, simply:
// s1=((s1&4294967294)<<12)^(((s1<<13)^s1)>>19) ;
// s2=((s2&4294967288)<<4)^(((s2<<2)^s2)>>25) ;
// s3=((s3&4294967280)<<17)^(((s3<<3)^s3)>>11) ;
// return (s1^s2^s3) ;

//............................./ DRNG_Tausworthe \.................................
double DRNG_Tausworthe (void)
{       return ( (double) RNG_Tausworthe () * 2.3283064365 e-10);
}
 
Los dos programas anteriores en Ce (o MQL) están casi garantizados para dar 2^50 ..... 2^88 (eso es un montón) de números pseudoaleatorios.
 

:)))

 
Mda....)
 
No entiendo las frases ni de la chica ni de los americanos.
¿No es suficiente con 2^88?
Para el comercio, es suficiente. Para aplicaciones serias, también existe R250, (2^250) pero es más complicado. No lo encontrarás más sencillo que el que te he dado. Bueno, para aplicaciones realmente SERIAS Intel tiene dos generadores de números aleatorios reales incorporados en las CPUs de los servidores, puedes combinarlos con los programas anteriores.
Se llama Intel LaGrande. Una descripción y cómo llamar a estos generadores se puede encontrar aquí:
http://www.intel.com/technology/security/


/*** Prototipos de funciones para el generador de números aleatorios R250, por W. L. Maier ***/
unsigned int r250(void);
unsigned int r250n(unsigned n);
double dr250(void);
Archivos adjuntos:
r250.rar  3 kb
 
AlexEro >>:
Не понял я реплик ни от девушки, ни от америкоса.
Это мало, чтоли, 2^88?
Для трейдинга - вполне достаточно. Для серъёзных приложений есть ещё R250, (2^250) но там сложнее прога. Проще, чем я привёл - не найдёте. Ну для совсем СЕРЪЁЗНЫХ приложений - у Интела в серверных процессорах есть два встроенных настоящих хардварных генератора случайных чисел - их можно скрестить с указанными прогами.
Называется Intel LaGrande. Описание и как вызывать эти генераторы найдёте здесь:
http://www.intel.com/technology/security/


/*** Function prototypes for R250 random number generator, by W. L. Maier ***/
unsigned int r250(void);
unsigned int r250n(unsigned n);
double dr250(void);


Estoy llenando totalmente el MQL. Y por cierto, mi avatar alude a mi dibujo animado favorito, no a mi género.
 
Y "Generación de números aleatorios uniformemente distribuidos (0,1)"
 
gumgum >>:


Я полностью double в MQL заполняю.

Bien, entonces219937 - llamado Mersenne twister

https://en.wikipedia.org/wiki/Mersenne_twister

 
gumgum >>:


И кстати мой аватар намекает на мой любимый мультфильм, а не половую принадлежность.

Cuando era joven, todos pensábamos que el avatar debía aludir a tu tipo de cerveza favorito.

Ya sé que la cerveza es perjudicial en cantidades importantes, pero aun así... piénsalo con calma.

Decídete.