Линейный конгруэнтный генератор - это, по сути, выражение, которое модифицирует заданное значение для получения следующего значения в ряду. Он принимает форму:
x i + 1 = (a . x i + b) мод m
как вы уже указали (немного иначе: меня учили всегда ставить x i + 1 слева, и я все еще боюсь моих учителей математики 25 лет спустя :-), где значения для a
, b
и m
тщательно отобраны, чтобы дать приличный диапазон значений. Обратите внимание, что с оператором mod
вы всегда получите значение от 0
до m-1
включительно.
Также обратите внимание, что значения имеют тенденцию быть целыми, а не числами с плавающей запятой, поэтому, если, по вашему запросу, вам нужно значение в диапазоне 0-0,999 ... вам нужно поделить интегральное значение на m
чтобы получить это.
Объяснив, как это работает, вот простая Java-программа, которая реализует ее, используя значения a
, b
и m
из вашего вопроса:
public class myRnd {
// Linear congruential values for x(i+1) = (a * x(i) + b) % m.
final static int a = 25173;
final static int b = 13849;
final static int m = 32768;
// Current value for returning.
int x;
public myRnd() {
// Constructor simply sets value to half of m, equivalent to 0.5.
x = m / 2;
}
double next() {
// Calculate next value in sequence.
x = (a * x + b) % m;
// Return its 0-to-1 value.
return (double)x / m;
}
public static void main(String[] args) {
// Create a new myRnd instance.
myRnd r = new myRnd();
// Output 20 random numbers from it.
for (int i = 0; i < 20; i++) {
System.out.println (r.next());
}
}
}
А вот вывод, который мне все равно кажется случайным: -).
0.922637939453125
0.98748779296875
0.452850341796875
0.0242919921875
0.924957275390625
0.37213134765625
0.085052490234375
0.448974609375
0.460479736328125
0.07904052734375
0.109832763671875
0.2427978515625
0.372955322265625
0.82696533203125
0.620941162109375
0.37451171875
0.006134033203125
0.83465576171875
0.212127685546875
0.3128662109375