Module: Concurrent::ThreadSafe::Util::XorShiftRandom

Extended by:
XorShiftRandom
Included in:
XorShiftRandom
Defined in:
lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb

Overview

A xorshift random number (positive +Fixnum+s) generator, provides reasonably cheap way to generate thread local random numbers without contending for the global +Kernel.rand+.

Usage: x = XorShiftRandom.get # uses Kernel.rand to generate an initial seed while true if (x = XorShiftRandom.xorshift).odd? # thread-localy generate a next random number do_something_at_random end end

Constant Summary collapse

MAX_XOR_SHIFTABLE_INT =
MAX_INT - 1

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.getundocumented

Generates an initial non-zero positive +Fixnum+ via +Kernel.rand+.



27
28
29
# File 'lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb', line 27

def get
  Kernel.rand(MAX_XOR_SHIFTABLE_INT) + 1 # 0 can't be xorshifted
end

.xorshift(x) ⇒ undocumented

using the "yˆ=y>>a; yˆ=y<>c;" transform with the (a,b,c) tuple with values (1,1,54) to minimise Bignum overflows



34
35
36
37
38
# File 'lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb', line 34

def xorshift(x)
  x ^= x >> 3
  x ^= (x << 1) & MAX_INT # cut-off Bignum overflow
  x ^= x >> 14
end

Instance Method Details

#getundocumented

Generates an initial non-zero positive +Fixnum+ via +Kernel.rand+.



27
28
29
# File 'lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb', line 27

def get
  Kernel.rand(MAX_XOR_SHIFTABLE_INT) + 1 # 0 can't be xorshifted
end

#xorshift(x) ⇒ undocumented

using the "yˆ=y>>a; yˆ=y<>c;" transform with the (a,b,c) tuple with values (1,1,54) to minimise Bignum overflows



34
35
36
37
38
# File 'lib/concurrent-ruby/concurrent/thread_safe/util/xor_shift_random.rb', line 34

def xorshift(x)
  x ^= x >> 3
  x ^= (x << 1) & MAX_INT # cut-off Bignum overflow
  x ^= x >> 14
end