31 lines
694 B
Plaintext
31 lines
694 B
Plaintext
module LCG {
|
|
|
|
# Creates a linear congruential generator and remembers the initial seed.
|
|
class Common(r) {
|
|
has seed = r
|
|
}
|
|
|
|
# LCG::Berkeley generates 31-bit integers using the same formula
|
|
# as BSD rand().
|
|
class Berkeley < Common {
|
|
method rand {
|
|
self.r = ((1103515245 * self.r + 12345) & 0x7fff_ffff);
|
|
}
|
|
}
|
|
|
|
# LCG::Microsoft generates 15-bit integers using the same formula
|
|
# as rand() from the Microsoft C Runtime.
|
|
class Microsoft < Common {
|
|
method rand {
|
|
self.r = ((214013 * self.r + 2531011) & 0x7fff_ffff);
|
|
self.r >> 16;
|
|
}
|
|
}
|
|
}
|
|
|
|
var lcg1 = LCG::Berkeley(1)
|
|
say 5.of { lcg1.rand }
|
|
|
|
var lcg2 = LCG::Microsoft(1)
|
|
say 5.of { lcg2.rand }
|