Module: Concurrent::ThreadSafe::Util::XorShiftRandom — Concurrent Ruby

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

Extended by:
  XorShiftRandom

Included in:
  XorShiftRandom

Defined in:
  lib/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/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/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/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/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