module Random::ArrayExtensions

Random extensions for Array class.

Public Instance Methods

at_rand() click to toggle source

Return a random element from the array.

@example

[1, 2, 3, 4].at_rand           # => 2
[1, 2, 3, 4].at_rand           # => 4
# File lib/garcon/core_ext/random.rb, line 129
def at_rand
  at(SecureRandom.random_number(size))
end
at_rand!() click to toggle source

Same as at_rand, but acts in place removing a random element from the array.

@example

a = [1,2,3,4]
a.at_rand!       # => 2
a                # => [1,3,4]
# File lib/garcon/core_ext/random.rb, line 141
def at_rand!
  delete_at(SecureRandom.random_number(size))
end
pick(n = nil) click to toggle source

Similar to at_rand, but will return an array of randomly picked exclusive elements if given a number.

# File lib/garcon/core_ext/random.rb, line 147
def pick(n = nil)
  if n
    a = self.dup
    a.pick!(n)
  else
    at(SecureRandom.random_number(size))
  end
end
pick!(n = nil) click to toggle source

Similar to at_rand!, but given a number will return an array of exclusive elements.

# File lib/garcon/core_ext/random.rb, line 158
def pick!(n = nil)
  if n
    if n > self.size
      r = self.dup
      self.replace([])
      r
    else
      r = []
      n.times { r << delete_at(SecureRandom.random_number(size)) }
      r
    end
  else
    delete_at(SecureRandom.random_number(size))
  end
end
rand_index() click to toggle source

Random index.

# File lib/garcon/core_ext/random.rb, line 176
def rand_index
  SecureRandom.random_number(size)
end
rand_subarrays(n = 1) click to toggle source

Generates random subarrays. Uses random numbers and bit-fiddling to assure performant uniform distributions even for large arrays.

@example

a = *1..5
a.rand_subarrays(2) # => [[3, 4, 5], []]
a.rand_subarrays(3) # => [[1], [1, 4, 5], [2, 3]]
# File lib/garcon/core_ext/random.rb, line 213
def rand_subarrays(n = 1)
  raise ArgumentError, 'negative argument' if n < 0
  (1..n).map do
    r = rand(2**self.size)
    self.select.with_index { |_, i| r[i] == 1 }
  end
end
rand_subset(number = nil, exclusive = true) click to toggle source

Returns a random subset of an Array. If a number of elements is specified then returns that number of elements, otherwise returns a random number of elements upto the size of the Array.

By defualt the returned values are exclusive of each other, but if exclusive is set to ‘false`, the same values can be choosen more than once.

When exclusive is true (the default) and the number given is greater than the size of the array, then all values are returned.

@example

[1, 2, 3, 4].rand_subset(1)        # => [2]
[1, 2, 3, 4].rand_subset(4)        # => [2, 1, 3, 4]
[1, 2, 3, 4].rand_subset           # => [1, 3, 4]
[1, 2, 3, 4].rand_subset           # => [2, 3]
# File lib/garcon/core_ext/random.rb, line 197
def rand_subset(number = nil, exclusive = true)
  number = SecureRandom.random_number(size) unless number
  number = number.to_int
  return sort_by{rand}.slice(0,number) if exclusive
  ri =[]; number.times { |n| ri << SecureRandom.random_number(size) }
  return values_at(*ri)
end
shuffle() click to toggle source

Randomize the order of an array.

@example

[1,2,3,4].shuffle  # => [2,4,1,3]
# File lib/garcon/core_ext/random.rb, line 226
def shuffle
  dup.shuffle!
end
shuffle!() click to toggle source

As with shuffle but modifies the array in place. The algorithm used here is known as a Fisher-Yates shuffle.

@example

a = [1,2,3,4]
a.shuffle!
a  # => [2,4,1,3]
# File lib/garcon/core_ext/random.rb, line 238
def shuffle!
  s = size
  each_index do |j|
    i = SecureRandom.random_number(s-j)
    tmp = self[j]
    self[j] = self[j+i]
    self[j+i] = tmp
  end
  self
end