2007年11月09日

カブらない数字を4桁だすの 〜勝手に拡大解釈篇

dropdbさんのところでお題が出て、まちゅさんが反応しているので絡んでみる。

最初に僕の思いついたのはこんな感じで。
(0..9).sort_by{rand}[0,4]
0〜9の配列を作ってシャッフル、先頭4文字を取り出す方法で。さっきdropdbさんのところを覗いたら、同じ方法が既にコメント欄に先に書かれていたけど、まぁいいや:p
ここで、dropdbさんの方法を見ると、
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氏に酷評されていると評判の翻訳版にもきっと出ているはず・・・

Chapter 4 Arrays 未収録

『Rubyクックブック』の原書と和書の違いについて
未収録orz
まぢですか。。

というわけで、気になる方は原書の方をどうぞ。

Ruby Cookbook (Cookbooks (O'Reilly))
Lucas Carlson Leonard Richardson
Oreilly & Associates Inc (2006/07/28)
売り上げランキング: 6141
posted by cesare at 12:52 | 技術関連
この記事へのTrackBack URL

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。