From: matz@... (Yukihiro Matsumoto) Date: 1999-12-06T11:18:32+09:00 Subject: [ruby-dev:8535] Re: [REQ] {enumerable, integer, range}.rand まつもと ゆきひろです In message "[ruby-dev:8528] Re: [REQ] {enumerable, integer, range}.rand" on 99/12/05, Kazuhiro Nishiyama 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 です。 まつもと ゆきひろ /:|)