Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8097 maxcodehac 1
(* ************************************
2
   Генератор какбыслучайных чисел,
3
   Линейный конгруэнтный метод,
4
   алгоритм Лемера.
5
   Вадим Исаев, 2020
6
   -------------------------------
7
   Generator pseudorandom numbers,
8
   Linear congruential generator,
9
   Algorithm by D. H. Lehmer.
10
   Vadim Isaev, 2020
11
*************************************** *)
12
 
13
MODULE Rand;
14
 
15
IMPORT HOST, Math;
16
 
17
 
18
CONST
19
 
20
    RAND_MAX = 2147483647;
21
 
22
 
23
VAR
24
    seed: INTEGER;
25
 
26
 
27
PROCEDURE Randomize*;
28
BEGIN
29
    seed := HOST.GetTickCount()
30
END Randomize;
31
 
32
 
33
(* Целые какбыслучайные числа до RAND_MAX *)
34
PROCEDURE RandomI* (): INTEGER;
35
CONST
36
    a = 630360016;
37
 
38
BEGIN
39
    seed := (a * seed) MOD RAND_MAX
40
    RETURN seed
41
END RandomI;
42
 
43
 
44
(* Какбыслучайные числа с плавающей запятой от 0 до 1 *)
45
PROCEDURE RandomR* (): REAL;
46
    RETURN FLT(RandomI()) / FLT(RAND_MAX)
47
END RandomR;
48
 
49
 
50
(* Какбыслучайное число в диапазоне от 0 до l.
51
   Return a random number in a range 0 ... l *)
52
PROCEDURE RandomITo* (aTo: INTEGER): INTEGER;
53
    RETURN FLOOR(RandomR() * FLT(aTo))
54
END RandomITo;
55
 
56
 
57
(* Какбыслучайное число в диапазоне.
58
   Return a random number in a range *)
59
PROCEDURE RandomIRange* (aFrom, aTo: INTEGER): INTEGER;
60
    RETURN FLOOR(RandomR() * FLT(aTo - aFrom)) + aFrom
61
END RandomIRange;
62
 
63
 
64
(* Какбыслучайное число. Распределение Гаусса *)
65
PROCEDURE RandG* (mean, stddev: REAL): REAL;
66
VAR
67
    U, S: REAL;
68
 
69
BEGIN
70
    REPEAT
71
        U := 2.0 * RandomR() - 1.0;
72
        S := Math.sqrr(U) + Math.sqrr(2.0 * RandomR() - 1.0)
73
    UNTIL (1.0E-20 < S) & (S <= 1.0)
74
 
75
    RETURN Math.sqrt(-2.0 * Math.ln(S) / S) * U * stddev + mean
76
END RandG;
77
 
78
 
79
BEGIN
80
    seed := 654321
81
END Rand.