module Random::ArrayExtensions
Public Instance Methods
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
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
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
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
Random
index.
# File lib/garcon/core_ext/random.rb, line 176 def rand_index SecureRandom.random_number(size) end
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
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
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
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