Subversion Repositories Kolibri OS

Rev

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

  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.