タグ

2008年12月4日のブックマーク (3件)

  • 配列のシャッフルの決まり文句は「sort_by{ rand }」だった - http://rubikitch.com/に移転しました

    配列要素のランダム抽出でRuby1.8.7をチェック - 技術メモ的なモノと気になるモノ 元のget_random_dataはエラーが出てたので修正。Ruby 1.8.6以前ではあれこれ考えるよりも「sort_by { rand }」するのが手っ取り早い。 だが、Ruby 1.8.7になるとそんなイディオム知らなくても「shuffle」と言えばいいだけ。意図がわかって文字数減って楽チン。 def get_random_data(data,max_size=nil) max_size = data.size unless max_size data_list = data.dup #sliceを使うのでコピー (1..max_size).map {|i|data_list.slice!(rand(data_list.size))} end def shuffle_n(data,n=nil)

    配列のシャッフルの決まり文句は「sort_by{ rand }」だった - http://rubikitch.com/に移転しました
    taninsw
    taninsw 2008/12/04
    Rubyのsort_by{rand}はシュワルツ変換だから大丈夫との事。
  • ランダムソート(笑)とは - 西尾泰和のはてなダイアリー

    誰が「ソートするときに比較関数に『ランダムに1か-1を返す関数』を与えたらシャッフルできる」って言い出したのかしらないけど、真に受ける方も真に受ける方だと思う。 たとえばソート関数が下のような「リストの先頭の値をピボットにしてそれより大きいものと小さいものに振り分けるクイックソート」だったとする。比較関数の所はランダムにしてある。 >>> def quicksort(xs): from random import random if len(xs) < 2: return xs pivot = xs[0] left = [] right = [] for x in xs[1:]: if random() < 0.5: left.append(x) else: right.append(x) return quicksort(left) + [pivot] + quicksort(right

    ランダムソート(笑)とは - 西尾泰和のはてなダイアリー
    taninsw
    taninsw 2008/12/04
    ちゃんと確かめた人がいた
  • 単純で正しそうなものが正しいとは限らない - Radium Software

    Coding Horror: The Danger of Naïveté 配列の中身をランダムな順序にシャッフルするコードを書きたい。単純でいいから分かりやすくて間違いの無いコードを書こう。例えば,こんな感じに…… for (int i = 0; i < cards.Length; i++) { int n = rand.Next(cards.Length); Swap(ref cards[i], ref cards[n]); } これは単純で分かりやすい! でも残念! このコードは間違っている。シャッフル後の順序に偏りが出てしまう。正解はこちら。 for (int i = cards.Length - 1; i > 0; i--) { int n = rand.Next(i + 1); Swap(ref cards[i], ref cards[n]); } ぱっと見て違いが分かる? イン

    単純で正しそうなものが正しいとは限らない - Radium Software
    taninsw
    taninsw 2008/12/04
    後者の方はカードをランダムに1枚づつ抜いて並べていくのと一緒かな。配列ひとつでやってるから分かりにくいけど。/前者の方法がどれだけ偏るのか気になるので後で元ネタ読む