http://d.hatena.ne.jp/halo_w2/20050422#p2
これ前から気になってたんですよねぇ.自分が一番いやだと思う例が
mt19937 rng; variate_generator<mt19937, uniform_int<> > rnd(rng, uniform_int<>(-1000,1000)); vector<int> v; list<int> l; generate_n(back_inserter(v), 50, rnd); generate_n(back_inserter(l), 50, rnd); assert(equal(v.begin(), v.end(), l.begin())); // 同じ乱数列が生成されてる.ぎにゃーす!!
どうにも乱数生成器とコピーって相性が悪い感じが・・・.特にSTLは(Boostもだけれど)ファンクタを値渡しするという原則があるので特にそれが顕著.どうしたもんかにゃ〜.もちろんグローバルな状態を持つことの欠点も十分理解しているんだけれど.きのこる先生さんが書いてるようにそういう要求があるならポインタなりリファレンスなりでラップしろってことなのかなぁ.これ関連の議論見てみたいんだけれど,以前探したときは見つからなかったんだよにゃ〜.む〜ん.
ちなみにSTLの中で唯一「ファンクタ値渡しの原則」に外れているアルゴリズムがあります.
http://www.sgi.com/tech/stl/random_shuffle.html
乱数生成器を受けることを大前提にしてるアルゴリズムなので当然といえば当然ですが・・・.
#あ,random_shuffleが要求するファンクタってGeneratorとまた違うConceptじゃん.うがー,ま〜ち〜が〜え〜た〜.
http://www.sgi.com/tech/stl/RandomNumberGenerator.html