Generazione di numeri casuali uniformemente distribuiti (0,1) - pagina 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);
}
 
I due programmi di cui sopra in Ce (o MQL) sono quasi garantiti per dare 2^50 ..... 2^88 (è un sacco) di numeri pseudo-casuali.
 

:)))

 
Mda....)
 
Non capisco le battute della ragazza o degli americani.
Non è sufficiente 2^88?
Per il trading, è sufficiente. Per applicazioni serie, c'è anche R250, (2^250) ma è più complicato. Non lo troverete più semplice di quello che vi ho dato. Bene, per applicazioni davvero SERIE Intel ha due generatori di numeri casuali cablati reali integrati nelle CPU dei server, è possibile combinarli con i programmi di cui sopra.
Si chiama Intel LaGrande. Una descrizione e come chiamare questi generatori può essere trovata qui:
http://www.intel.com/technology/security/


/*** Prototipi di funzioni per il generatore di numeri casuali R250, di W. L. Maier ***/
unsigned int r250(void);
unsigned int r250n(unsigned n);
doppio dr250(void);
File:
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);


Sto riempiendo completamente il MQL. E a proposito, il mio avatar allude al mio cartone animato preferito, non al mio sesso.
 
E "Generazione di numeri casuali uniformemente distribuiti (0,1)"
 
gumgum >>:


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

Allora219937 - chiamato twister di Mersenne

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

 
gumgum >>:


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

Quando ero giovane, tutti pensavamo che l'avatar dovesse alludere al tuo tipo di birra preferito.

Ora so che la birra è dannosa in quantità sostanziali, ma comunque... Pensateci a vostro piacimento.

Decidetevi.