Jump To …

src/seeds/

mersenne_twister.coffee


          
class MersenneTwister
  constructor: (seed=0) ->
    @mt = Array 623
    @z = 0
    @y = 0

    @plantSeed seed

  plantSeed: (seed=0) ->
    @mt[0] = seed
    @mt[i] = ((0x10dcd * @mt[i-1]) + 1) & 0xFFFFFFFF for i in [1..623]

  get: ->
    @generateNumbers() if @z >= 623
    @extractNumber(@z++) / 0x80000000

  generateNumbers: ->
    @z = 0
    for i in [0..623]
      @y = 0x80000000 & @mt[i] + 0x7FFFFFFF & (@mt[(i + 1) % 623])

      if @y % 2 is 0
        @mt[i] = @mt[(i + 397) % 623] ^ (@y >> 1)
      else
        @mt[i] = @mt[(i + 397) % 623] ^ (@y >> 1) ^ 0x9908B0DF

  extractNumber: (i) ->
    @y = @mt[i]
    @y ^= (@y >> 11)
    @y ^= (@y << 7) & 0x9d2c5680
    @y ^= (@y << 15) & 0xefc60000
    @y ^= (@y >> 18)

module.exports = MersenneTwister