math-library
/
Random.cpp
52 строки · 941.0 Байт
1
2// my_rand(): алгоритм взят из книги "Numerical Recipes in C", с.279
3// my_rand_norm(): алгоритм взят из книги Кнут "Искусство программирования", раздел 3.4, с.4
4
5#include <math.h>
6#include <time.h>
7#include <assert.h>
8
9#include "Random.h"
10
11#define IA 16807
12#define IM 2147483647
13#define AM (1.0/IM)
14#define IQ 127773
15#define IR 2836
16#define MASK 123459876
17
18long SEED;
19
20void my_randomize()
21{
22SEED = time(NULL);
23}
24
25double my_rand(double min, double max)
26{
27assert(min<max);
28
29long k;
30double ans;
31
32SEED ^= MASK;
33k = SEED/MASK;
34SEED = IA*(SEED - k*IQ) - IR*k;
35if(SEED < 0) SEED += IM;
36ans = AM*SEED;
37SEED ^= MASK;
38
39return min + ans*(max - min);
40}
41
42double my_rand_norm(double Mu0, double D)
43{
44double v1,v2,s;
45
46do{
47v1 = 2*my_rand(0,1) - 1;
48v2 = 2*my_rand(0,1) - 1;
49s = pow(v1,2) + pow(v2,2);
50} while(s>=1);
51
52return Mu0 + D*v1*sqrt(-2*log(s)/s);
53}