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
-
.get ⇒ undocumented
Generates an initial non-zero positive +Fixnum+ via +Kernel.rand+.
-
.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.
Instance Method Summary collapse
-
#get ⇒ undocumented
Generates an initial non-zero positive +Fixnum+ via +Kernel.rand+.
-
#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.
Class Method Details
.get ⇒ undocumented
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
#get ⇒ undocumented
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 |