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}とかよりこっちの方が簡単じゃないすか。