In article <466D5B1D.8030205 / sarion.co.jp>,
  "NAKAMURA, Hiroshi" <nakahiro / sarion.co.jp> writes:

> 実装はあとでどうとでもなるので、akrさんにインターフェースを決めていただ
> きたいところ。思わずrandから移行したくなるような奴をお願いします。

rand の 4文字という短さには勝てないって...

パッチを見るとインターフェースは以下のようになってますね。

Random < Data
Random#rand
Random.seed
Random.default
Random.default=(klass)
Random.current
Random.current=(rng)

Random::MT < Random
Random::MT#initialize(seed)
Random::MT#float
Random::MT#upto(max_plus_one)
Random::MT#seed

まず気がつくのは Random じゃなくて Random::MT ということです。
これと別のデザインとしては、Random 自体を Mersenne Twister
のクラスにするというものがあるでしょう。

おそらくまつもとさんは後者を考えているんじゃないですかね。

私も Random 自体でいいと思います。必要なら後で
Random::MT = Random ともできますし。

Kernel.{rand,srand} の切替え用に default, current がありますが、
グローバルな状態を増やすのは感心しません。

Mersenne Twister を期待するライブラリとそうでないライブラリ
があったとき、切替えで両方の希望を満たすことはできません。
ライブラリの組合せのことを考えたら、こういう機能はないほうが
いいと思います。Mersenne Twister 以外を使いたければ自分で生
成した random number generator を自分で保持しておけばいいで
しょう。

もし、Mersenne Twister を期待するライブラリが存在しないとい
う状況が生まれるとしたら、Mersenne Twister に問題が発見され
た時だと思うのですが、そのときは ruby 本体を直すのが正道だし、
それでは間に合わないとしても rand/srand を再定義することは可
能ですから、こういう切替え機能はいらないんじゃないでしょうか。

切替えの別案としては、グローバルでなく、ダイナミックに、とか
レキシカルに、というものが考えられますが、ダイナミック (スレッ
ド変数) だとライブラリ間の期待の衝突を防げませんし、レキシカ
ルというのは今の Ruby でどう実装したらいいかわかりません。切
替えについては selector namespace とか classbox で
rand/srand をレキシカルに切替えられることを期待するあたりが
いいんじゃないでしょうか。

Random::MT の中については upto という名前が気になります。
upto(10) ならやっぱり 10 までだと思うのですが、ここでは 9 ま
でなので名前がよろしくないと思います。すぐに思い付くメソッド
名としては integer があげられるでしょうか。

あとは追加メソッドを検討すると OpenSSL::Random や
SecureRandom から random_bytes, hex, base64 が考えられますが、
そういうのがあると cookie に使いやすくなるのでむしろないほう
がいいという気がします。
-- 
[田中 哲][たなか あきら][Tanaka Akira]