本当に 本当に すごくどうでもいい話 なのだが……
C++ の std::mt19937 の使い方みたいな話において示されているコードの形って,(私の観測範囲が狭くてたまたまそう見えているだけなのかもしれないけど)
std::random_device rd; //random_device 型の rd を用意する行
std::mt19937 mt( rd() ); // rd() を ctor 引数にする行
っていう2行な構成の形が妙に多い感じ?
こんな話で人様の記事を示すのも失礼な気もするが,このリンク先記事でもこの形になっている.
cpprefjpの例も同じ形になってる.
なぜこの形が示されるのだろうか? そこが微妙に不思議.
「シード値を mt19937 の ctor で与えるんだよ」という話の説明をする場面であれば ,例えば
std::random_device rd;
auto Seed = rd(); //シード値を rd から得て
std::mt19937 mt( Seed ); //それをctor引数で与える
とか
auto Seed = std::random_device()(); //シード値を random_device で得て
std::mt19937 mt( Seed ); //それをctor引数で与える
みたいな感じに シード値という存在を明示する形 にする方が説明用コードとしては分かりやすいと思うし,それをしないならば
std::mt19937 mt{ std::random_device()() }; //random_device で得た値をctor引数にする
っていう1行でよくね?(以降,random_device は使わないのに rd みたいなのを定義する行をあえて書く意味とは何か?)っていう気がする.
なので,よく見かける2行構成のやつはなんか不自然(説明用としても実用の形としても中途半端っていうか?)な感じがする.
多分,単に自分の感覚が世間のそれとはずれてるってだけなのだろうけど……
- コードを書く際に「
mt1997を使いたい → 何かシード値が必要だが,どうするのか? →random_deviceから得よう」という思考過程だった場合には1行のやつになるだろうし - 「乱数系列のシード値が必要だよな」っていうのが真っ先に頭に浮かんだ場合だと,なにはともあれ
auto Seed = ...的なのを書くことから始まるように思う
そうやって書いたコードを後から整理するとしても, random_device 型のオブジェクトを定義する行が単独で生まれる形にはなりそうにないんだよな.
(冒頭にも書いたように,だからどうしたってことでもなく,どうでもいい話なんですが……)