On 2007-02-25 21:08:35 +0100, Brian Candler <B.Candler / pobox.com> 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.