From: Tim Hunter Date: 2008-06-02T04:00:04+09:00 Subject: Re: Is this deterministic or not? slix wrote: > puts "Enter a sentence: " > puts gets.split.sort_by { rand }.join(" ") > > takes a sentence and scrambles the words. how is this implemented? i > tried myself first with a for or while loop and tried if word is not > in new_sentence then new_sentence += word etc. > but that could go on for a long time and would be very slow for a > large text. > > I assume you already know how gets, split, and join work and the question in your subject refers to sort_by. The sort_by method sorts the enumerable (in this case, the array of words produced by split) using the keys generated by the block. That is, sort_by calls the block once for each element in the array. The block usually (but not in this case) inspects the element and returns a key. You're wanting a random sort, so you use the rand method to return a random number as the key. The sort_by method sorts the array in increasing order by the random numbers. Since the keys are randomly generated, the array is randomly ordered. Is it deterministic? See my P.S. You can use srand to ensure that rand returns the same sequence of numbers. The doc for sort_by is pretty good. Try "ri sort_by", and "ri Kernel#rand". P.S. I'm sure there's a lot of good things to be said about PRNGs and stuff but I'll let somebody else type it in. -- RMagick: http://rmagick.rubyforge.org/ RMagick 2: http://rmagick.rubyforge.org/rmagick2.html