31 lines
671 B
Ruby
31 lines
671 B
Ruby
module LCG
|
|
module Common
|
|
# The original seed of this generator.
|
|
attr_reader :seed
|
|
|
|
# Creates a linear congruential generator with the given _seed_.
|
|
def initialize(seed)
|
|
@seed = @r = seed
|
|
end
|
|
end
|
|
|
|
# LCG::Berkeley generates 31-bit integers using the same formula
|
|
# as BSD rand().
|
|
class Berkeley
|
|
include Common
|
|
def rand
|
|
@r = (1103515245 * @r + 12345) & 0x7fff_ffff
|
|
end
|
|
end
|
|
|
|
# LCG::Microsoft generates 15-bit integers using the same formula
|
|
# as rand() from the Microsoft C Runtime.
|
|
class Microsoft
|
|
include Common
|
|
def rand
|
|
@r = (214013 * @r + 2531011) & 0x7fff_ffff
|
|
@r >> 16
|
|
end
|
|
end
|
|
end
|