sort_by{rand}はちゃんとshuffleできてるのか

できてるのか。

irb(main):001:0> ([0]*7000).map{(0..6).to_a.sort_by{rand}[0]}.inject([0]*7){|t,i|t[i]+=1;t}
=> [947, 977, 979, 1022, 1021, 1047, 1007]

さらに

k.inaba 2009/05/29 09:34 これも http://chasen.org/~taku/blog/archives/2006/08/schwartzian_tra.html

それっぽい言葉とそれっぽい結果だけで満足してはいけませんね。

普通のshuffleてどんなの。

rubyに組み込みのArray.shuffle
static VALUE
rb_ary_shuffle_bang(VALUE ary)
{
    long i = RARRAY_LEN(ary);

    rb_ary_modify(ary);
    while (i) {
        long j = rb_genrand_real()*i;
        VALUE tmp = RARRAY_PTR(ary)[--i];
        RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
        RARRAY_PTR(ary)[j] = tmp;
    }
    return ary;
}
Pythonのshuffle
    def shuffle(self, x, random=None, int=int):
        """x, random=random.random -> shuffle list x in place; return None.

        Optional arg random is a 0-argument function returning a random
        float in [0.0, 1.0); by default, the standard random.random.
        """

        if random is None:
            random = self.random
        for i in reversed(range(1, len(x))):
            # pick an element in x[:i+1] with which to exchange x[i]
            j = int(random() * (i+1))
            x[i], x[j] = x[j], x[i]

同じアルゴリズム。sort_by{rand}とかよりこっちの方が簡単じゃないすか。

test