Array.shuffle/Array.shuffle!

J

Jeff Moore

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...
 
T

Tim Hunter

Jeff said:
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?

ary2 = ary.sort_by { rand }
 
S

Stefan Rusterholz

Jeff said:
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 = self, 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)
 
J

Jeff Moore

As of 1.8.7 you have those methods already natively provided by ruby.

Regards
Stefan (apeiros)

Ah! If only the Ubuntu/Debian promotion cycle for Ruby out paced
continental drift...

Thanks again...

I appreciate it.
 
J

Joel VanderWerf

Jeff said:
Ah! If only the Ubuntu/Debian promotion cycle for Ruby out paced
continental drift...

I heard the 9.04 release will be called Galloping Gondwanaland.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,969
Messages
2,570,161
Members
46,705
Latest member
Stefkari24

Latest Threads

Top