> -- Alexey Veselovsky писал(а):
> ...Или есть какой-то более кошерный способ генерации псевдослучайных целых чисел в BB? (про обероны не говорю, ибо общей какой-то библиотеки, или хотя бы общей вики по библиотекам просто нет).
Для ВВ есть неплохая математическая библиотека -  Epse21. В модуле Random там целый набор генераторов. Компилируется по крайней мере нормально:) Скачать можно тут:http://www.zinnamturm.eu/downloadsDH.htm#Epse21

На Oberon-2 я использую такой модуль (взят с небольшими переделками из исходников Oo2c)
## Код:
```
MODULE RandomNumbers;
(** Детали алгоритма см. в Park S.K. and Miller K.W. (1988)
  "Random number generators, good ones are hard to find". 
  Communications of the ACM, 31, 1192-1201. *)

CONST modulo* = 2147483647;  (* =2^31-1 *)
VAR z* : LONGINT;

(** Инициализация генератора целым числом: *) 
   
PROCEDURE PutSeed*(seed: LONGINT);
BEGIN
    seed := seed MOD modulo;
    IF (seed = 0) THEN z := 1 ELSE z := seed END
END PutSeed;

PROCEDURE NextRND;
CONST
    a = 16807;
    q = 127773;      (* m div a *)
    r = 2836;        (* m mod a *)
VAR lo, hi, test: LONGINT;
BEGIN
    hi := z DIV q;
    lo := z MOD q;
    test := a * lo - r * hi;
    IF (test > 0) THEN z := test ELSE z := test + modulo END
END NextRND;

(** Целые случайные числа в диапазоне 0 <= x < range. 
   Range должен быть в интервале 1 .. 2^31-2 *)
PROCEDURE RND*(range : LONGINT): LONGINT;
BEGIN
    NextRND;
    RETURN z MOD range
END RND;

(** Вещественные случайные числа в диапазоне 0.0 <= x < 1.0 *)
PROCEDURE Random*(): REAL;
BEGIN
    NextRND;
    RETURN (z-1)*(1 / (modulo-1))
END Random;

BEGIN
  z := 314053
END RandomNumbers.
```
