こんばんは、ZnZです。

On [Thu, 2 Dec 1999 12:25:39 +0900]
matz / netlab.co.jp (Yukihiro Matsumoto) wrote:
>   class Random
>     include Enumerable
>     def initialize(max)
>       @max = max
>     end
>     def each
>       loop do
>         rand(@max)
>       end
>     end
>   end

loop do
  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)

# アルゴリズムはらくだ本の「ファイルから行をランダムに選択する」です。

# Module Enumerableに入れる方法がわからなかったです(^^;
# Ruby本まだ買えてない(^^;。注文すべきだったのかも(^^;

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