dropdbさんのところでお題が出て、まちゅさんが反応しているので絡んでみる。
(0..9).sort_by{rand}[0,4]
0〜9の配列を作ってシャッフル、先頭4文字を取り出す方法で。さっきdropdbさんのところを覗いたら、同じ方法が既にコメント欄に先に書かれていたけど、まぁいいや:p
ary = [] #空の配列です。
4.times{ #4回繰り返して
n = rand 10 #0-9までの乱数を発生させ配列に入れる。
redo if ary.include? n #既に配列にnがあった場合はもう1度
ary.push n
}
print ary
出力は「7492」みたいに横に繋がって出てくる。まちゅさんの方法も同様。
nums = (0..9).to_a 4.times do print nums.delete_at(rand(nums.size)) endもしかすると「カブらない4つの数字を要素に持つリストを作る」んじゃなくて数字がカブらない4桁の整数を作るのがゴールなのかも。と、勝手に拡大解釈してみるとこんな感じ?
(0..9).sort_by{rand}[0,4].join.to_i
これだとリストの先頭が0になっている可能性があって、そうなると整数値としては3桁になってしまうのでマズい。(「0745」みたいな文字列表現なら問題ないけど)
numbers = (0..9).sort_by{rand}
(numbers[0] == 0 ? numbers[1,4] : numbers[0,4]).join.to_i
にしてみるとか。
sort_by{rand}でリストをシャッフルする方法は「Ruby Cookbook」にも登場しております。手軽に書ける反面で、リストのサイズが大きいときは効率が悪くなるので、別の方法を使うべし、とこのと。例として挙がっているのは、リストを先頭から順番に辿って「自分より後ろの要素をランダムに選んで入替える」というもの。詳しくはCookbookのChapter4 Arrays の 4.10 Shuffling an Array をどうぞ。僕の手元にあるのは原書版の方なのだけど、dankogai氏に酷評されていると評判の翻訳版にもきっと出ているはず・・・
未収録orzChapter 4 Arrays 未収録
『Rubyクックブック』の原書と和書の違いについて
まぢですか。。
というわけで、気になる方は原書の方をどうぞ。
Oreilly & Associates Inc (2006/07/28)
売り上げランキング: 6141
