まつもと ゆきひろです

In message "[ruby-dev:8528] Re: [REQ] {enumerable, integer, range}.rand"
    on 99/12/05, Kazuhiro Nishiyama <nishiyama / mx1.tiki.ne.jp> writes:

|loop do
|  rand(@max)
|end
|って?

あ、

  loop do
    yield rand(@max)
  end

です。

|> また、Enumerableでrandを実現するためには、一度全部の要素を配
|> 列に変換する必要があり、効率の悪さ、繰り返しできない可能性な
|> どの要素を考えても賛成できません。
|
|そんなことはないと思います。
|名前の問題とかはおいといてとりあえず。
|
|def random_get(arg)
|  n=0
|  ret=nil
|  arg.each do |i|
|    n += 1
|    ret = i if rand(n) < 1
|  end
|  ret
|end
|
|srand
|p random_get([1,2,3,4,5,6,7,8,9])
|p random_get({1=>2,3=>4,5=>6,7=>8})
|p random_get(1..9)
|p random_get(1...9)

配列を生成する必要はなかったですね。でも、効率の悪さと繰り返
しできないという点は変わらないでしょう?

  f = open("/usr/dict/words")
  p random_get(f)
  p random_get(f)

はちゃんと動かないと思うのです。

|# Module Enumerableに入れる方法がわからなかったです(^^;

  module Enumerable
    def random_get
      ...
    end
  end

です。
                                まつもと ゆきひろ /:|)