From: Stefano Crocco Date: 2009-02-05T22:42:04+09:00 Subject: Re: Array#choice always produce the same sequence Alle Thursday 05 February 2009, ruud grosmann ha scritto: > > I've just stumbled upon a strange behaviour of Array#choice (using ruby > > 1.8.7- p72). As far I understand, an_array.choice should be (almost) the > > same as an_array[rand(an_array.size)]. Thus, the two following pieces of > > code should be equivalent > > > > a = [1, 2, 3, 4] > > p 10.times.map{a.choice}.join > > p 10.times.map{a[rand(a.size)]}.join > > > > However, this doesn't seem to be the case. In particular, something like: > > > > ruby -e 'a = [1, 2, 3, 4]; p 10.times.map{a.choice}.join' > > > > always give the same result, while > > > > ruby -e 'a = [1, 2, 3, 4]; p 10.times.map{a[rand(a.size)]}.join' > > > > gives a different result every time the command is executed (which, in my > > opinion, is the correct behaviour). > > > > It seems that to get the correct behaviour from choice, you need to call > > srand > > before using it. Does anyone know why this is necessary with choice but > > not with rand? Is it the intended behaviour or a bug? > > > > Thanks > > > > Stefano >Hi Stefano, > >it seems to work for me: > >irb(main):003:0> a = [1, 2, 3, 4] >=> [1, 2, 3, 4] >irb(main):004:0> p 10.times.map{a.choice}.join >"4414312344" >=> nil >irb(main):006:0> p 10.times.map{a[rand(a.size)]}.join >"4342411331" >=> nil >irb(main):007:0>  p 10.times.map{a.choice}.join >"2333341212" >=> nil >irb(main):008:0> p 10.times.map{a.choice}.join >"1312441122" >=> nil >irb(main):009:0>  p 10.times.map{a.choice}.join >"2412444223" >=> nil >Z ruby -v >ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] Maybe I wasn't clear in explaining the issue. Within a single irb session (or ruby invocation in general) I, too, get different results at each invocation. The problem is that if I run the script twice, I get the same results for each call to choice (that is, the first call to choice gives the same result at each ruby invocation; the second call always gives the same result, which can be different from the first, and so on). A simpler example: File: test.rb p [1,2,3,4].choice ruby test.rb => 4 ruby test.rb => 4 ruby test.rb => 4 And so on. If at the beginning of the script I add a call to Kernel#srand (without arguments), I get the correct behaviour, that is a different number every time the script is run. Stefano