From: Tanaka Akira Date: 2007-06-12T01:11:31+09:00 Subject: [ruby-dev:30954] Random In article <466D5B1D.8030205@sarion.co.jp>, "NAKAMURA, Hiroshi" 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]