From: Josselin Date: 2007-02-26T06:40:05+09:00 Subject: Re: extract a random number of items from an array On 2007-02-25 21:08:35 +0100, Brian Candler said: > On Mon, Feb 26, 2007 at 01:20:07AM +0900, Josselin wrote: >> given an array of values, how should I extract an random number of these >> values >> >> a = [13, 15, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, >> 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, >> 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, >> 77, 78, 79, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 96, >> 97, 98, 99, 100, 101, 102, 103, 104, 105, 106] >> >> def extract_values( an_array, n) >> ... >> return another_array of n values extracted randomly from an_array >> end >> >> I don't know where to start .. >> - create an array of n random indexes from 0 to an_array.length, and >> use it to extract the value > > Are you trying to do pick 'n' elements from 'a' like lottery balls? i.e. > once a value has been picked once, it cannot be picked again? no, I need to put all the balls again for the next pick I am creating a random test set of records , but I'll copy your recipes in my Ruby notebook... thanks > > Short but inefficient: > > result = a.sort_by{rand}[0...n] > > More efficient (but deletes elements from 'a', so dup it first if necessary): > > result = [] > n.times { result << a.slice!( rand(a.size) ) } > > Or if I misunderstood the question, and duplicate picks are allowed: > > result = [] > n.times { result << a[ rand(a.size) ] } > > HTH, > > Brian.