From: Stefan Rusterholz Date: 2008-08-24T19:17:11+09:00 Subject: Re: Array.shuffle/Array.shuffle! Jeff Moore wrote: > This works but I can't escape the nagging sense that there's a more > concise approach (for one thing, it looks like there are way too > transient objects to me). > > Anyone have a better idea? > > > class Array > > def shuffle > t_self = self.dup > t_size = self.size > result=[] > t_size.times { result << t_self.slice!(rand(t_self.size)) } > result > end > > def shuffle! > t_self = self.dup > t_size = self.size > self.clear > t_size.times { self << t_self.slice!(rand(t_self.size)) } > self > end > > end > > > Regards... If you need a less predictable one than the sort_by { rand } then I suggest this: class Array # Shuffle the array def shuffle! n = length for i in 0...n r = Kernel.rand(n-i)+i self[r], self[i] = self[i], self[r] end self end # Return a shuffled copy of the array def shuffle dup.shuffle! end end This shuffle is known as fisher-yates/knuth shuffle and is afaik by current means considered impossible to predict. Also its complexity is O(n) compared to the O(nlogn) of sort_by (which for many cases probably still is faster in ruby since it runs mainly in C, I didn't bench it, though). As of 1.8.7 you have those methods already natively provided by ruby. Regards Stefan (apeiros) -- Posted via http://www.ruby-forum.com/.