[#8530] Enumerable and rand — Koretsugu Daigoro <tmmcross@...>

これつぐです。

21 messages 1999/12/05
[#8534] Re: Enumerable and rand — matz@... (Yukihiro Matsumoto) 1999/12/06

まつもと ゆきひろです

[#8581] Re: [ruby-list:19228] Ruby 1.4.3 — Katsuyuki Komatsu <komatsu@...>

小松です。

19 messages 1999/12/07
[#8592] Re: [ruby-list:19228] Ruby 1.4.3 — matz@... (Yukihiro Matsumoto) 1999/12/07

まつもと ゆきひろです

[#8645] urllib and httplib — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

47 messages 1999/12/14
[#8646] Re: urllib and httplib — "NAKAMURA, Hiroshi" <nakahiro@...> 1999/12/14

なひです.

[#8653] Re: urllib and httplib — matz@... (Yukihiro Matsumoto) 1999/12/14

まつもと ゆきひろです

[#8656] Re: urllib and httplib — "NAKAMURA, Hiroshi" <nakahiro@...> 1999/12/15

なひです.

[#8659] Re: urllib and httplib — Wakou Aoyama <wakou@...> 1999/12/15

青山です。

[#8685] Re: urllib and httplib — "NAKAMURA, Hiroshi" <nakahiro@...> 1999/12/21

なひです.

[#8687] Re: urllib and httplib — TAKAHASHI Masayoshi <maki@...> 1999/12/21

高橋征義です。

[#8690] Re: urllib and httplib — matz@... (Yukihiro Matsumoto) 1999/12/21

まつもと ゆきひろです

[#8717] Re: urllib and httplib — TAKAHASHI Masayoshi <maki@...> 1999/12/24

高橋征義です。

[#8963] Re: urllib and httplib — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/01/19

なひです.

[#8650] [PATCH] Ruby/Tk — Koji Arai <JCA02266@...>

新井です。

20 messages 1999/12/14
[#8651] Re: [PATCH] Ruby/Tk — Koji Arai <JCA02266@...> 1999/12/14

新井です。

[#8692] [win] dir name — KANEKO Naoshi <wbs01621@...>

金子です。

22 messages 1999/12/21
[#8695] Re: [win] dir name — Koji Oda <oda@...1.qnes.nec.co.jp> 1999/12/22

小田@QNES です。

[#8741] Re: [ruby-list:19945] Re: array + empty string — Wakou Aoyama <wakou@...>

青山です。

18 messages 1999/12/27
[#8743] Re: [ruby-list:19945] Re: array + empty string — matz@... (Yukihiro Matsumoto) 1999/12/28

まつもと ゆきひろです

[#8742] [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — Kazunori NISHI <kazunori@...>

西@九大です。

64 messages 1999/12/27
[#8744] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — matz@... (Yukihiro Matsumoto) 1999/12/28

まつもと ゆきひろです

[#8748] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — Kazunori NISHI <kazunori@...> 1999/12/28

西@九大です。

[#8751] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — matz@... (Yukihiro Matsumoto) 1999/12/28

まつもと ゆきひろです

[#8767] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — Kazunori NISHI <kazunori@...> 1999/12/29

西@九大です。

[#8777] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — matz@... (Yukihiro Matsumoto) 1999/12/30

まつもと ゆきひろです

[#8791] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — Minero Aoki <aamine@...> 1999/12/31

あおきです。

[#8792] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — matz@... (Yukihiro Matsumoto) 1999/12/31

まつもと ゆきひろです

[#8793] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — ARIMA Yasuhiro <fit0298@...> 1999/12/31

有馬です。

[#8795] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — Akinori MUSHA aka knu <knu@...> 1999/12/31

 knuです。

[#8798] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — matz@... (Yukihiro Matsumoto) 2000/01/01

まつもと ゆきひろです

[#8811] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num) — Akinori MUSHA aka knu <knu@...> 2000/01/03

 knuです。

[ruby-dev:8474] Re: [REQ] {enumerable, integer, range}.rand

From: matz@... (Yukihiro Matsumoto)
Date: 1999-12-01 03:21:59 UTC
List: ruby-dev #8474
まつもと ゆきひろです

In message "[ruby-dev:8463] Re: [REQ] {enumerable, integer, range}.rand"
    on 99/12/01, Kazunori NISHI <kazunori@swlab.csce.kyushu-u.ac.jp> writes:

|From: matz@netlab.co.jp (Yukihiro Matsumoto)
|> でも、それって rand ではなく、shuffleとかrandomizeではないで
|> すかねえ。
|
|それは、「名前」的な問題(Kernel#rand と名前が衝突しているから)ですか?
|それとも「機能」的な問題(要素を全部入れ変えた方が汎用的)ですか?
|
|提案された名前から、前者ではないと思いますが。(前者はむしろ肯定したい、
|という気持ちは後述)。で、後者だとしても
|
|  * (! だとすると) self 自身の順序は保ちたい
|  * (! でなければ) shuffle.shift などは高価過ぎる
|
|という理由から、rand でいいと思います。あくまで rand(array[array.size])
|と等機能のメソッドを意図してます。これとは別に、shuffle(!)/randomize(!)
|もあってよいと思います。

意図をできるだけ汲むと、結局array[rand(array.size)]相当の 
random が求められていて、かつ内容をまぜてしまう randomize,
shuffleもあっても良いという話なんですかね。

ここではまず新参もののshuffleは置いといて話をすると、

  (1) そのようなメソッドは必要か
  (2) 名前は
  (3) どのクラスのメソッドとするか

という3つの質問があります。(1)は割と根源的なので、あとで話を
します。(2)についてですが、randでは「乱数を返す」と思われそ
うなのでやめた方が良さそうです。ごとけんさんの案に従いrandom
の方が良さそうです。(3)ですが、randomeの定義

        array[rand(array.size)]

を見ても分かる通り、このメソッドはeachだけでは定義できません。
ですから、Enumerableに含まれる第1要件を満たしていません。ま
た、sortのように「内部的に配列に変換してsort」のような処理が
それなりに嬉しい局面も少なそうです。よってArrayに定義するこ
とを推します。

さて、ここで(1)の「そもそもこのメソッドを組み込みで定義する
ことが必要なのか」という問題に返ると、はっきり言って良く分か
りません。なんだかプログラムの先頭に

  class Array
    def random() self[rand(size)] end
  end

と3行追加することで十分のような気がします。

ちゅーことで、この件に対する現状での私のスタンスは

  * もう一段説得されるまでなにもしない
  * 追加するならば、Array#random

というところです。shuffleについても

  * もう一段説得されるまでなにもしない
  * 追加するならば、Array#shuffle または Array#randominze
    !メソッドも用意する

です。

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

コストは結構軽いです。

|で、いっそ rand(Numeric/Range/Enumerable) に
|してもいい気がしてます。

rand(Numeric/Range)はともかく、rand(Enumerable)ってどんな挙
動をするんですか?

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

あたり、よってrand(10)であり、10.randではないということ。

In This Thread