西@九大です。

From: matz / netlab.co.jp (Yukihiro Matsumoto)
> でも、それって rand ではなく、shuffleとかrandomizeではないで
> すかねえ。

それは、「名前」的な問題(Kernel#rand と名前が衝突しているから)ですか?
それとも「機能」的な問題(要素を全部入れ変えた方が汎用的)ですか?

提案された名前から、前者ではないと思いますが。(前者はむしろ肯定したい、
という気持ちは後述)。で、後者だとしても

  * (! だとすると) self 自身の順序は保ちたい
  * (! でなければ) shuffle.shift などは高価過ぎる

という理由から、rand でいいと思います。あくまで rand(array[array.size])
と等機能のメソッドを意図してます。これとは別に、shuffle(!)/randomize(!)
もあってよいと思います。

>   (1) 名前が適切ならば採用か。ただし、EnumerableかArrayかは
>       まだ考慮の余地あり。

上の理由から、Enumerable#rand でよいと思います。(Kernel#rand との衝突
を問題にしているのであれば、Enumerable#random でも)

多分、Enumerable と Array の選択は、shuffle/randomize を想定した時に起
きる問題だと思います。確かにその場合は、Enumerable(Set?) が順序を持つ?
元から乱数的では?という疑問があります。(そこには触れたくないらしい)

>   (2) 「ある範囲の乱数」は欲しいかも。インタフェースは考慮の
>       余地あり。

これは、ごとけんさんの rand(range) 案に賛成です。でも range オブジェク
トを生成するコストは無視していいんですかね?(ここらへんの実装上のコス
トは想像つかないらしい)。で、いっそ rand(Numeric/Range/Enumerable) に
してもいい気がしてます。

>   (3) 整数のメソッドとしてはやや不適切な臭いが。

私もこれはやり過ぎだと思いますが、ちょっと抵抗してみます。(暇なのか?)

オブジェクト指向において、10.print 等は両者に相関性が無い事から不自然
ですが、10.rand, 10.sin などは自然で、(OO的には)むしろ本来のあるべき姿
だと思います。これは、

    rand や sin という機能には数(Numeric)が不可欠であり、その「数」が
    それらの機能を持つ(メソッドを持つ)のは自然である。

と考えるからです。しかし、人間の思考においては、特に sin 等は、これま
での(その人の)経験から、「数学」での考え方(表記法)に従う方が可読性が高
い為に、ruby では数学の関数的な表現法をとっている。。。
#個人的には、この前向きな妥協が、Smalltalk より Ruby が好きな点です

私はこういう捉え方だったので、なぜ rand(10) だけ残って 10.rand がない
んだろう、という疑問が湧きました。確かにあっても(私も)使わないでしょう
が、そういう流れであれば、残っているべきではないのか?と。

でも、そういう流れじゃないんですよね、多分。(抵抗して自己解決する奴)。
ていうか、Math.sin(10) じゃないとエラーになるし。(sin(10) が通ると思っ
てた人の言い分)

rand も、元はシステムコール(カーネル/OS)に依存するから Kernel.rand(10) 
であり、「そこらへんは冗長だからもういいよね。もっと気軽に行こうよ」的
思想から、rand となった。という経緯だと推測しています。

------------------------------------------------------------------
九州大学大学院システム情報科学研究科 情報工学専攻 博士後期課程三年
      西 和則   ( e-mail: kazunori / swlab.csce.kyushu-u.ac.jp )
------------------------------------------------------------------
#「第2話、10.print は悪か?」に続く..