こんばんは、ZnZです。

On [Mon, 6 Dec 1999 11:18:32 +0900]
matz / netlab.co.jp (Yukihiro Matsumoto) wrote:
> 配列を生成する必要はなかったですね。でも、効率の悪さと繰り返
> しできないという点は変わらないでしょう?
> 
>   f = open("/usr/dict/words")
>   p random_get(f)
>   p random_get(f)
> 
> はちゃんと動かないと思うのです。

これを実行してみて繰り返しできないの意味がやっと
わかりました(^^;

効率の悪さも汎用なのでこんなものだと思ったのですが、
words[rand(words.size)]と比べて結構違うと思いました(^^;

# 元々配列にする必要がないと言うことだけいいたかったのでした。


>   module Enumerable
>     def random_get
>       ...
>     end
>   end
> 
> です。

module Enumerable
  def random_get
    n=0
    ret=nil
    self.each do |i|
      n += 1
      ret = i if rand(n) < 1
    end
    ret
  end
end

srand
p [1,2,3,4,5,6,7,8,9].random_get
p ({1=>2,3=>4,5=>6,7=>8}.random_get)
p ((1..9).random_get)
p ((1...9).random_get)


p (1..9).random_get
p (1...9).random_get

がうまくいかなかったのは(p (1..9)).random_getになったからだと
わかったのですが、

p {1=>2,3=>4,5=>6,7=>8}.random_get
      ^
ここでparse errorになるのがなぜなのかよくわかりませんでした。

--- 
ZnZ(ゼット エヌ ゼット)
西山和広(Kazuhiro Nishiyama)
mailto:nishiyama / mx1.tiki.ne.jp