Module | Random::Array |
In: |
lib/more/facets/random.rb
|
Return a random element of the array.
[1, 2, 3, 4].at_rand #=> 2 [1, 2, 3, 4].at_rand #=> 4
# File lib/more/facets/random.rb, line 107 107: def at_rand 108: at(Random.number(size)) 109: end
Similar to at_rand!, but given a number will return an array of exclusive elements.
# File lib/more/facets/random.rb, line 135 135: def pick!(n=nil) 136: if n 137: if n > self.size 138: r = self.dup 139: self.replace([]) 140: r 141: else 142: r = [] 143: n.times { r << delete_at(Random.number(size)) } 144: r 145: end 146: else 147: delete_at(Random.number(size)) 148: end 149: 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.
[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/more/facets/random.rb, line 175 175: def rand_subset( number=nil, exclusive=true ) 176: number = Random.number(size) unless number 177: number = number.to_int 178: #return self.dup if (number >= size and exlusive) 179: return sort_by{rand}.slice(0,number) if exclusive 180: ri =[]; number.times { |n| ri << Random.number(size) } 181: return values_at(*ri) 182: end
Randomize the order of an array.
[1,2,3,4].shuffle #=> [2,4,1,3]
# File lib/more/facets/random.rb, line 188 188: def shuffle 189: dup.shuffle! 190: #sort_by{Random.number} 191: end
As with shuffle but modifies the array in place. The algorithm used here is known as a Fisher-Yates shuffle.
a = [1,2,3,4] a.shuffle! a #=> [2,4,1,3]
CREDIT Niel Spring
# File lib/more/facets/random.rb, line 202 202: def shuffle! 203: s = size 204: each_index do |j| 205: i = Random.number(s-j) 206: #self[j], self[j+i] = self[j+i], self[j] 207: tmp = self[j] 208: self[j] = self[j+i] 209: self[j+i] = tmp 210: end 211: self 212: end