From: Kazuhiro Nishiyama Date: 1999-12-06T23:25:28+09:00 Subject: [ruby-dev:8552] Re: [REQ] {enumerable, integer, range}.rand こんばんは、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