トップページ⇒tech
1001コメント292KB

Ruby について Part 3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。

Ruby Home Page
http://www.ruby-lang.org/ja/

<前スレ>
Rubyについて Part 2
http://pc3.2ch.net/test/read.cgi/tech/1028906179/

<過去スレ>
Rubyについて
http://pc3.2ch.net/test/read.cgi/tech/1012096319/
0412デフォルトの名無しさんNGNG
>>411
> rubyは毎回のループごとに1+1をいちいち計算してるわけか…

その手の最適化って一切しないのけ?
0413デフォルトの名無しさんNGNG
>>412
Fixnum#+が再定義されないとも限らないので、「最適化」しちゃうわけにはいかない。
この議論はdevでもtalkでも繰り返し出てるんで、検索してみるのがよろしいかと。
0414デフォルトの名無しさんNGNG
>>404
http://raa.ruby-lang.org/list.rhtml?name=shim-ruby16_18
0415デフォルトの名無しさんNGNG
>>409 >>410
str='efgh';str2='abcd' を N.times の外に出したら変わるのかも
0416デフォルトの名無しさんNGNG
PerlのInline::Ruby使ってる人いる?
これでレンタル鯖にRubyインスコされてなくてもCGI書けるね。
http://search.cpan.org/author/NEILW/Inline-Ruby-0.02/lib/Inline/Ruby.pod
0417デフォルトの名無しさんNGNG
うーんしかしこういうのはいかがなものか

#define BEGIN {
とかいうのとあんまり変わらないような気もする(そんなこともないかな)
0418デフォルトの名無しさんNGNG
つーか Ruby が入って無いと使えないんじゃないのか?
0419デフォルトの名無しさんNGNG
正規表現の互換性を無くす話だけど、ruby-talk側には常識的な人が
多いようで、少し安心した。
0420デフォルトの名無しさんNGNG
頭が逝かれてるのは作者と一部の信者だけだろ
0421デフォルトの名無しさんNGNG
>>408-410
同じく406ではないがやってみた。
$ ruby -v ./time.rb
ruby 1.6.4 (2001-06-04) [i586-linux]
+ user 9.3900, system 0.0500, total 9.4400
<< user 10.1600, system 0.0400, total 10.2000

何故だ......_| ̄|○
0422デフォルトの名無しさんNGNG
>>421
<< の測定前にGCしたら変わったりして

N=1000000
t0=Time::times; N.times{str='efgh';str2='abcd';str=str+str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+", u,s,u+s)
GC.start
t0=Time::times; N.times{str='efgh';str2='abcd';str<<str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)
0423421NGNG
406ではな(ry

>>422
変わらなかったっす。
くっだらねーイージーミスであることを恐れてソースを>>422からコピペして動かしてみましたが結果変わらず。
+ user 9.0300, system 0.0800, total 9.1100
<< user 9.7100, system 0.0800, total 9.7900

ちなみに
$ rpm -qi ruby
Name : ruby Relocations: (not relocateable)
Distribution: Kondara MNU/Linux 2.0(Mary) Vendor: (none)
Version : 1.6.4 Option: (none)
Release : 2k Build Date: 2001年06月07日 13時12分4

時代に取り残された環境です(〃▽〃)♪
0424デフォルトの名無しさんNGNG
http://www.k-514.com/
(σ・∀・)σゲッツ!!
0425デフォルトの名無しさんNGNG
>423
1.6.4ってえらく古いな
kondaraの動向は知らんがmomongaに乗り換えたら新しいrpmが使えるのかな
0426 ◆hMJAPH9PWA NGNG
一見<<演算子のほうが速いように思えるが…どういう実装なんだろう。
<<の実装と+の実装が同じなのかな。
0427デフォルトの名無しさんNGNG
jpegのデータを読み込んだStringから
GD::Image.newFromJpeg(file)でimage instanceを作りたいのですが
ファイルを作らずにStringから直接image instanceを作れないでしょうか?
0428デフォルトの名無しさんNGNG
ローカル変数のアクセスが微妙に影響してるような。

N=1000000
t0=Time::times; N.times{'efgh'+'abcd'}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+", u,s,u+s)
GC.start
t0=Time::times; N.times{'efgh'<<'abcd'}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)

$ ruby-1.6 -v /tmp/s.rb
ruby 1.6.8 (2003-03-26) [i686-linux]
+ user 4.7000, system 0.0300, total 4.7300
<< user 4.6700, system 0.0300, total 4.7000
0429デフォルトの名無しさんNGNG
>>427
gdImageCreateFrom*Ctx()はサポートしてないみたいだな。
作者にリクエスト汁。
0430デフォルトの名無しさんNGNG
1.8はいつ出るの?
0431デフォルトの名無しさんNGNG
作者の気が向いたら。
0432デフォルトの名無しさんNGNG
>>431
Preview releaseが出てるのに気が向いたらも糞もあるか
0433デフォルトの名無しさんNGNG
子供の日とかじゃないの?
0434デフォルトの名無しさんNGNG
もう一回くらいはpreview必要だろ。五月でもどうかなぁ。
0435デフォルトの名無しさんNGNG
作者はイラクに人間の盾に行ったので、戻ってきません。
0436初心者NGNG
class Insertion_sort
def mini_sort(index,array)
i = index
unsorted_array = array
judge = true
while judge
if unsorted_array[i - 1] > unsorted_array[i] || i != 1
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i--
else
judge = false
end
end
end
def Insertionsort.sort(unsorted_array)
i = 1
while i < (unsorted_array.size)
mini_sort(i,unsorted_array)
i++
end
sorted_array = unsorted_array
return sorted_array
end
end

test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p Insertionsort::sort(test_array)
0437初心者436NGNG
配列とし渡した、数字の並びを挿入ソートしたいのですが
上のように書いたら次のようなメッセージで動きません。
test3.rb:12: parse error
test3.rb:22: parse error
test3.rb:29: parse error
p Insertionsort::sort(test_array)
^
Ruby始めたばっかりで、どこがおかしいか検討がつきません。
endの閉じ忘れとかは注意したはずなんですが。。
なにかおかしなところ指摘してください。
動かない理由以外でも、書き方のへんなところとか教えて下さい。
0438デフォルトの名無しさんNGNG
i++やi--はないのでi+=1やi-=1とかいてください
0439初心者436NGNG
>>438
そこを直すと、違うエラーメッセージがでてきて進みそうです。
よくみたらクラス名もおかしかった。。

もうちょっと自分でやってみます
アドバイスありがとうございました

0440できた436NGNG
class Insertion_sort
def self.mini_sort(index,array)
i = index
unsorted_array = array
judge = true
while judge
if unsorted_array[i-1] > unsorted_array[i] && i != 0 then
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i -= 1
else
judge = false
end
end
return unsorted_array
end

def self.sort(unsorted_array)
i = 1
while i < unsorted_array.size do
unsorted_array = mini_sort(i,unsorted_array)
i += 1
end
sorted_array = unsorted_array
return sorted_array
end
end

test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p Insertion_sort::sort(test_array)
0441デフォルトの名無しさんNGNG
>>440
これだと破壊的だがそれで良い?

例えば
test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p test_array.sort, test_array # Array#sort は test_array を破壊しない
p Insertion_sort::sort(test_array), test_array # Insertion_sort::sort は破壊的

結果
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
[2, 4, 45, 6, 3, 677, 32, 64, 453, 1, 3, 56, 7, 0]
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
0442デフォルトの名無しさんNGNG
>>440
breakというものを教えて上げたいような上げたくないような。
0443436NGNG
>>441
もとのsortメソッドの名前をsort!に改めて
新しく次のようにsortメソッドを作りました。
普段、あまり破壊的、非破壊的ということを意識してませんでした。
単純にcloneメソッドを使ってつくりました。
def self.sort(unsorted_array)
i = 1
cloned_unsorted_array = unsorted_array.clone
while i < cloned_unsorted_array.size do
cloned_unsorted_array = mini_sort(i,cloned_unsorted_array)
i += 1
end
sorted_array = cloned_unsorted_array
return sorted_array
end
0444436NGNG
>>442
breakを使うとしたら、mini_sortのwhile文中でしょうか?
loopとbreakを使うとすっきりしました。
def self.mini_sort(index,array)
i = index
unsorted_array = array
loop{
if unsorted_array[i-1] > unsorted_array[i] && i != 0 then
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i -= 1
else
break
end
}
return unsorted_array
end
0445デフォルトの名無しさんNGNG
なんで>>443でwhile使っときながら>>444ではloop&breakになっちゃうんだよ。
0446 NGNG
私だったこう書く

module InsertionSort
  module_function

  def insertion_sort!(array)
    modified = nil
    for n in 0..array.size-1
      n.downto(1) do |i|
        break unless array[i-1] > array[i]
        array[i-1], array[i], modified = array[i], array[i-1], true
      end
    end
    modified and array
  end

  def insertion_sort(array)
    insertion_sort!(copy = array.dup) or copy
  end
end
0447デフォルトの名無しさんNGNG
しまった、ら抜き言葉を発明してしまった
0448デフォルトの名無しさんNGNG
漏れだったこう書く(w

module Enumerable
def insertion_sort
array = []
each do |a|
if array.each_with_index {|b, i|
if b > a
array[i, 0] = [a]
break
end
}
array << a
end
end
array
end
end
0449デフォルトの名無しさんNGNG
>>448
かちゅで読むとインデントされてないから無茶苦茶読みにくい
0450デフォルトの名無しさんNGNG
>>446 もしnavi2ch使ってたら
ttp://pc.2ch.net/test/read.cgi/unix/1046402063/360
0451デフォルトの名無しさんNGNG
RubyでCGIを作ってIISで実行するとrubyプロセスがIISサービスを
殺してしまい、ワトソンくんが出現します。(スタックオーバーフロー)
rubyは1.6.7のmswinです。
あと意味はないですが、CGIの先頭行に#!を記述しています。
もし何か知っている方いられましたら教えてください。
0452デフォルトの名無しさんNGNG
>451
RubyでCGIがうんぬんというより、そもそもスクリプトがスタック食いまくりとか
だったりしませんか?
0453デフォルトの名無しさんNGNG
>>451
Apacheに汁!
0454デフォルトの名無しさんNGNG
>>449
そりゃ悪かった。かちゅーしゃって行頭の空白消しちゃうのか。

module Enumerable
 def insertion_sort
  array = []
  each do |a|
   if array.each_with_index {|b, i|
      if b > a
       array[i, 0] = [a]
       break
      end
     }
    array << a
   end
  end
  array
 end
end
0455デフォルトの名無しさんNGNG
>>452
もしそうならWindowsはスタックサイズの上限を指定できないの?
0456デフォルトの名無しさんNGNG
>>455
できまっせ。
標準で1メガはあるはずだけど。
でもスタックオーバーフローを起こす様なプログラムは
アルゴリズム修正した方がいいんじゃねえの?
0457デフォルトの名無しさんNGNG
それはそうだがサーバプロセスが死ぬような設定もよろしくない
0458デフォルトの名無しさんNGNG
サーバプロセスを殺せるってことはmod_rubyなのか?
IISでmod_rubyって使えるんだっけ?
0459デフォルトの名無しさんNGNG
451です。
ただのRubyプロセスでIISがシニマス。
プロセス空間を別にしてもシニマス。
CGIスクリプトは最後まで完了していて、その後もRubyがガリガリしていて
まもなくIISがシニマス。
自分のちびマシンのAN HTTPDでは問題なく動作します。
Apache+Linuxでも問題なく動作します。
仕事の都合上IISしか使えません。
ということでマイっています。
0460デフォルトの名無しさんNGNG
>>459
スタックオーバーフローって出るのはrubyに対して、それともIIS?
サーバを殺してしまうということだと、吐いてるデータに問題があるような気
がするが、nphモードにしてみるとどうなる?

0461デフォルトの名無しさんNGNG
>>460
451です。
IISに対してオーバーフローが発生します。
そのときRubyは終了しています。
一時的に標準出力に出さないようにしてテストしてみます。
勉強不足ですみませんが、nphモードって何でしょうか?
0462デフォルトの名無しさんNGNG
No Parse Header mode の略。CGIスクリプトの吐くヘッダを鯖が解釈しないモード。
ttp://CGI-Spec.Golux.Com/draft-coar-cgi-v11-03-clean.html#7.0
IISではCGIスクリプトを nph- で始まるファイル名にすることでNPHモードになる。
NPHスクリプトは最初に "HTTP/1.0 201 Created\r\n" を出力しなければならない。
またヘッダの改行コードは \r\n にする。
0463デフォルトの名無しさんNGNG
>>462
451です。
詳細にありがとうございます。月曜日に試してみます。
HTTPヘッダでの方法でやってみます。
0464デフォルトの名無しさんNGNG
pai...
0465デフォルトの名無しさんNGNG
>>462
やってみましたが、結果は同じでした。
RubyプロセスがIISを殺せるなんてやっぱりおかしいので、IISのバグあたりが
妥当ではないかと思っています。
0466デフォルトの名無しさんNGNG
>>465
AN HTTPDでは動くってことは、その可能性が高いと思われ。
rubyを使わずに、固定のデータを送るようなCGIにしても同じかな?
0467デフォルトの名無しさんNGNG
添付ライブラリのURIクラスがあんまり遅いんでワラタ
使うのやめたら、10秒以上掛かってた処理が1秒を切ったよ。

これに限らず、Rubyの添付ライブラリは玉石混淆過ぎ
つか、地雷原(w
0468デフォルトの名無しさんNGNG
どういう使いかたしてたんだ?
0469デフォルトの名無しさんNGNG
漏れも実例が見てみたい
0470デフォルトの名無しさんNGNG
>>467の玉と石の分類を見てみたい。
煽りではなく、参考にさせてもらいたいので。
0471デフォルトの名無しさんNGNG
URI使う所の多くで、URIのインスタンスを使ってたの。
プロファイラに掛けたら、URI.parseも遅かったが、
URI#+は失禁するぐらい遅かった。

URIライブラリは、UriValidatorとUriUtilに分けたらどうだ?

CGIライブラリもなぁ、なんか使いにくいよ。
Ruby唯一の処理系に付属するオフィシャルな
おまけライブラリにしては、実装者のアクが強すぎ。
なんつーか、ツブシの効かない感じ。
0472デフォルトの名無しさんNGNG
>>471
プロファイラの結果見たい。遅いのはどのへん?
# URI::Generic#mergeあたりかな。
0473デフォルトの名無しさんNGNG
XMLを出力したいのですが、適当なライブラリって何になるのでしょうか?
xml-parserでできますっけ。
0474デフォルトの名無しさんNGNG
parserってんだから入力じゃないの。使ったことないので分からんけど。
http://raa.ruby-lang.org/cat.rhtml?category_major=Library;category_minor=XML
libxmlとかかねぇ。
0475デフォルトの名無しさんNGNG
そも「るるる」とは何ぞや?
0476デフォルトの名無しさんNGNG
単純な質問ですが、しばらくわからないままなので教えてください。

X ターミナルの表示可能なカラム数を Ruby から得るにはどうしたらいいですか?
やりたいことは、Debian や RedHat の apt-get を実行したときに、画面右端に出る
[38%] などのパーセント表示を右端ぴったりに出したい、ということなのですが。
0477デフォルトの名無しさんNGNG
age
0478デフォルトの名無しさんNGNG
>>476
安直でよければ
columns = (columns.to_i if columns = ENV["COLUMNS"])

ウィンドウリサイズに追従したければcursesでも使うべきだろう。
$ ruby -rcurses -e 'Curses.init_screen;l,c = Curses.lines,Curses.cols; Curses.close_screen;puts "#{c}x#{l}"'
100x50
0479476NGNG
>>478
ありがとうございました!その方法でやってみます。
0480山崎渉NGNG
(^^)
0481デフォルトの名無しさんNGNG
>>473
print文でいいんじゃねえの?
0482デフォルトの名無しさんNGNG
>>465
CGIでRubyがIISを落とす件です。
なんとなくわかりました。
httpdはIIS4です。フォームからCGIにデータを送信して、CGIの中で
Locationヘッダを使って自分のCGIに戻すことをしています。
掲示板なんかでの再読み込み防止策としてやったのですが、
これがなぜか無限ループに陥ってしまうのです。
リクエスト内容を見るとLocationにはクエリを渡していないのに
その前のフォームのデータが流れてきています。
そしてまたLocation。
ちなみにただLocationでループさせても適度な回数でたたききられます。
0483デフォルトの名無しさんNGNG
>>482
RFC2616 の
10.3 Redirection 3xx
14.30 Location
をよく読んだら何か分かるかも。
0484デフォルトの名無しさんNGNG
'a' =~ /(a*)*/
のマッチのあと、$1 が 'a' ではなく '' になるのはなぜでしょうか?
0485デフォルトの名無しさんNGNG
"a" に (a*) が2回マッチするからじゃないかのう。
0486デフォルトの名無しさんNGNG
>>482
つまりスレ違いだったわけでつね
0487 ◆hMJAPH9PWA NGNG
>>484
空文字列にマッチするから。
0488山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0489デフォルトの名無しさんNGNG
>>487
それじゃあ説明になってないんじゃ?
普通に考えると、a* が貪欲に 'a' にマッチすると思うんだけど。

/((a*)*)/.match('a').to_a # => ["a", "a", ""]

↑これは、ちょっと理解し難いです。
(a*) が空文字にマッチしてるのに、
どうしてその外側の ((a*)*) が 'a' にマッチし得るの?
0490デフォルトの名無しさんNGNG
>>489
だから内側のカッコは2回マッチしてるんだってば。
最終的な $~ は最後のマッチが有効になる。

これなら分かる?
$ ruby -e 'p /((ba*)*)/.match("bab").to_a'
["bab", "bab", "b"]
0491デフォルトの名無しさんNGNG
$~ が最後にマッチしたデータになるというのは分かります。
でも、なぜ(a*)が2回マッチするのかが分かりません。
1回目のマッチで文字列全部を取ってしまってるので、それで終了にはならないのですか?
0492デフォルトの名無しさんNGNG
>>491
.{0,0} は空文字列に最低一回マッチする。
0493489 (not (484 or 491))NGNG
>>490
あぁ、なるほど。理解できました。

(a*) は、1回目のマッチで 'a' を食べて、
2回目のマッチで '' を食べたところで繰り返しが終了し、
その時点のマッチの状態ってことで $1 = '' がセットされたってわけですね。
0494デフォルトの名無しさんNGNG
>>493
まあこういうのはマニュアルなんかにはあまり詳しく書かれてないから
Friedl の Mastering regular expressions でも買って読むのが吉
0495491NGNG
えっと、.* が空文字にヒットするのは分かるので、
2回目のマッチが行われれば $1 に '' が入るのは分かるのですが、
1回目のマッチですべての文字列を食べ終わっているのに
2回目のマッチを行おうとするというのがどうも理解できません。

文字列の最後に仮想的な空文字を想定して、
1回目のマッチ後ではそれがまだ残っているというふうに考えるのでしょうか。
0496デフォルトの名無しさんNGNG
>>495
まあそうなんだが「仮想的な空文字を想定して」というのはよく分からん。
まず空文字ではなくて空文字列というべきだろう。
そして仮想的に想定しているのでなく実際にある。
0497デフォルトの名無しさんNGNG
Time#to_s をそのまま Time.parse しても元に戻らないってのは不便じゃないですか?

irb(main):008:0> t = File.stat('foo').mtime.to_s
=> "Fri Jul 26 23:01:14 GMT+9:00 2002"
irb(main):009:0> Time.parse t
=> Sat Jul 26 23:01:14 UTC 2003
0498デフォルトの名無しさんNGNG
Time#to_s のフォーマットは好きに変えられるんだからいいじゃん?
0499デフォルトの名無しさんNGNG
Time#to_s って %Z とかあるからOS依存なのでは
0500デフォルトの名無しさんNGNG
>>497
そういうTZってありだっけ?

begin-base64 644 tz.diff.gz
H4sIAAAAAAACA71Ry2rbQBRde77iLAKRMh7r4dgmA0IJKZQssknclWWKLI3C
gCyZGdmkxvTbM3rFSeqmi0LuQvcx95xzxbkrUvHMkcuVk8aVcLJSreNqpFYk
+P8gD7ePyGQuOJxkpx21Xf1ytEra4k/N4Y4oUSkpdrJ4gjJJy7KAN5qSVGYZ
2BbMB9uAKTPD8VbG2IlfGPhXuI8VfNcdw53y8RWfuGCuiUHNSSk9iRrjZtOh
fJ/7U+52KHJ9bQ64nAxnoG0ygySPtcY3w0EwGACI9EVXWYQ1GVjEbL+kVsgj
TVNd2WG0IrR7M9OndXXYVokdLhhdRmm9yEOT7Y7ocCT6uEA/UWjBLYkdkruj
15Vciy8zuRP7q7ued8Jez0N/ZO9u139uqyHrfX3d/2DojHuXbwyducMJaPN9
tXNuoARtlOa0AIXM+8G+LISZ1Gm03SSxFoS1LzKDE91YC8qWthWlUWrzsM3R
3kHwu8EQ+m455N/v54cf81s7/BcQeHeSdeYhCHDOzhGCeeDwbFyYsT+qyp/S
lFMXFGfjprWbvucQuW71a8la6K3OCx+CUAoVBAAA
====
0501デフォルトの名無しさんNGNG
あ、lib/time.rbのほうは不要だった。
0502デフォルトの名無しさんNGNG
初歩的なことですが、どなたか教えて下さい。
実行結果、「123aaa456789」を期待していたのですが、
「123aaa789」となってしまいました。ファイルの途
中に追加書き込みするには、どうしたらよいのですか。

f = open("text","w")
f.print("123456789")
f.close

f = open("text", "r+")
f.seek(3, IO::SEEK_SET)
f.print("aaa")
f.close
0503デフォルトの名無しさんNGNG
>>502
直接的な手段はない。
ファイルの途中に直接挿入はできないので、
挿入したい位置から先を後ろへずらす必要がある。

0504デフォルトの名無しさんNGNG
>>502
ファイルがそれほど大きくなければ
f = open("text", "r+")
img = f.read       # 全部読んで
img[3,0] = "aaa"   # ファイルイメージを文字列として編集して
f.truncate(0)      # ファイルを切り詰めて
f << img           # 書き出すのが頭を使わなくて楽
f.close
0505497NGNG
OS依存というのは知りませんでした。
>>497はWindows2000のcygwin環境です。

>>500 どうもありがとうございます。
0506デフォルトの名無しさんNGNG
>>505
そのTZフォーマットの典拠を明示できるなら、
bugs-jaにでも投げといてくれるとありがたい。
0507502NGNG
>>503,504
どうもありがとうございます。

ファイルが大きく、編集箇所も多いので、
結局、以下のようにしました。

f_read = open("text1","w+")
f_read.print("123456789")
f_read.rewind

f_write = open("text2", "w")
f_write.print f_read.read(3)
f_write.print ("aaa")
f_write.puts f_read.gets

f_read.close
0508デフォルトの名無しさんNGNG
>>http://pc2.2ch.net/test/read.cgi/tech/1045074808/721
def random_permutation(n,k) (0..n-1).sort_by{rand}[0,k] end

sort_by は便利だ
0509デフォルトの名無しさんNGNG
>>508
(0..n-1).sort_by{rand}
(0..n-1).sort{rand<=>0.5}
確率的な違いをどう表現したらいい?
0510デフォルトの名無しさんNGNG
>>509
(0..n-1).sort_by{rand} が以下と等価かどうかすら分からん

def perm(a, k=0, v = [])
n = (a = a.to_a).size-1
n == k ? v<<a : (k..n).each{|i| perm((b=a.dup;b[k],b[i]=b[i],b[k];b),k+1,v)}
v
end

perm(0..n-1)[rand((1..n).inject(1){|v,x|v*x})]
0511デフォルトの名無しさんNGNG
qsortが平均n・log(n)っていうときの平均ってどれ?
■ このスレッドは過去ログ倉庫に格納されています