只今Ruby勉強中

プログラミングRuby―達人プログラマーガイド

うさぎさんと一緒にRubyの勉強をしているオレの記録。

間違ってる所とかいっぱいあると思いますけど、誰でもコメント出来るので気軽に教えて下さい。

普段は 鷹の島 って所で書いてます。

現在のハマリポイント - yield, succ?, Proc & 後で

2006-08-30 (Wed)

ランダム配列の話題 14:33  ランダム配列の話題 - 只今Ruby勉強中 を含むブックマーク

近頃配列をランダムにソートする話しが 話題になっていますが、Random 関数を使ってソートをするやり方はダメ駄目でウンコって事でした。

そんで Fisher-Yates とかいうアルゴリズムの存在も知りまして、これは後ろからランダムで前方の値と入れ替えていく、みたいな、なんか頭良さげな方法でして理解出来るまで時間がかかったりした感じ。

この前 pigコマンド作った時 は slice するやり方を取ったけど、sort_by っていう方法もあったなーと思い、そういえばこの sort_by ってどんな動きをしているかどうか気になっていたので調べてみました。

リファレンス読んでも良くわからんので色々動かして試してみた所、どうやら単純にブロック内の結果順で並び替えるっていうだけのものでした。

それで、まぁ ruby-list でも話題になっていた randomize メソッドを考えた。

こんだけなんでメソッドにする程でもない。

class Array
   def randomize
      sort_by { rand }
   end

   def randomize!
      replace(randomize)
   end
end

動作チェックコード。

count = []
3.times { count << [0, 0, 0] }

10000.times do
   [0, 1, 2].randomize.each_with_index do |v, i|
      count[i][v] += 1
   end
end
p count

実行。

$ ruby rand.rb
[[3343, 3293, 3364], [3279, 3437, 3284], [3378, 3270, 3352]]

綺麗に出来た。

ちなみに randomize の実行部を sort { rand - 0.5 } にして実行するとこんな感じ。

[[3707, 2603, 3690], [2510, 4945, 2545], [3783, 2452, 3765]]

かたよりんぐ。

ようするに sort_by すごい便利って事で。

Object#methods 22:00  Object#methods - 只今Ruby勉強中 を含むブックマーク

WEB+DB PRESS: p172

はてナオヤさんの Perl の話題の所にさりげなく書いてあって、これはまさに知りたかったやつでした!

この前 mailread を使ったプログラムを書いた時にメソッド一覧が欲しい!って思ったんだけど、やり方わかんなくて断念して結局ソース見たら50行くらいのコードだったからソース見た方が早かったって事がわかってションボリ。

こんな風にすれば良いらしい。

irb(main):001:0> require 'mailread'
=> true
irb(main):002:0> Mail.methods
=> ["inspect", "autoload?", "send", "class_eval", "clone", "public_methods", "method", "protected_instance_methods", "__send__", "private_method_defined?", "equal?", "freeze", "methods", "instance_eval", "dup", "include?", "private_instance_methods", "instance_variables", "extend", "protected_method_defined?", "const_defined?", "instance_of?", "name", "eql?", "public_class_method", "object_id", "hash", "id", "new", "singleton_methods", "taint", "frozen?", "instance_variable_get", "constants", "kind_of?", "to_a", "ancestors", "display", "private_class_method", "const_missing", "type", "autoload", "<", "protected_methods", "<=>", "instance_methods", "==", "method_defined?", "superclass", ">", "===", "instance_variable_set", "instance_method", "const_get", "is_a?", ">=", "respond_to?", "to_s", "<=", "module_eval", "class_variables", "allocate", "class", "public_instance_methods", "tainted?", "=~", "private_methods", "public_method_defined?", "__id__", "nil?", "untaint", "included_modules", "const_set"]

うわぁ、これじゃちょっとワカンネ。ていうか、body とか header とか出てないし。間違ってるのか…。

yamazyamaz2006/08/31 18:47こんにちは.Mail.methodsはMailのクラスメソッド一覧取得なので,
Mail.new("ファイル名").methods で望みのモノが取得できると思います.

gabagaba2006/08/31 19:57おおおお、これだ!すごい!!ありがとうございます。
これで今後の開発が少し楽になりそうです。

トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20060830