std::random_deviceが生成する数値列が毎回同じなのはOK？


MinGW版GCCでは、`std::random_device`のデフォルトコンストラクターを使うと毎回同じ数値列が生成されますが、これは規格に準拠した動作なのでしょうか？  
[実装の制限によって擬似乱数生成器を使うことは許されている](https://cpprefjp.github.io/reference/random/random_device.html)ようですが、`std::random_device`を使うということは予測不可能な乱数列を期待しているはずなので、種を固定して毎回同じ数値列が生成される（＝簡単に予測可能）のは、さすがにまずいと思うのですが。

参考：

  * [gccをwindowsで使うならstd::random_deviceを使ってはいけない - Qiita](http://qiita.com/nanashi/items/f94b78398a6c79d939e1)

[code]

    #include <random>
    #include <iostream>
    
    int main()
    {
        std::random_device rnd_gen;
        std::cout << rnd_gen() << "\n";
    }
    
[/code]

[code]

    D:\home\tmp\random>g++ --version
    g++ (tdm64-1) 5.1.0
    …
    
    D:\home\tmp\random>g++ -Wall -std=c++11 test_random_device.cpp
    
    D:\home\tmp\random>a.exe
    3499211612
    
    D:\home\tmp\random>a.exe
    3499211612
    
    D:\home\tmp\random>a.exe
    3499211612
    
[/code]




> 種を固定して毎回同じ数値列が生成される（＝簡単に予測可能）のは、さすがにまずいと思うのですが。

望ましい振る舞いではありませんが、ぎりぎりC++規格準拠といえる気はします。つまり "implementation-defined"
の範囲内であり、単に実装の品質が著しく低いという解釈です。（それを不具合と呼ぶかどうかはもはや基準による？）

別の観点ですが、該当環境で `std::random_device{}.entropy() == 0.0`
となっているか確認してみてください。処理系の都合で非決定的な乱数列を返せないときは、`entropy()`がゼロを返す仕様になっています。

関連する C++11仕様 §26.5.6 [rand.device] より引用（強調部分は回答者による）：

> 1 A `random_device` uniform random number generator produces non-
> deterministic random numbers.  
>  2 If implementation limitations prevent generating non-deterministic random
> numbers, **the implementation may employ a random number engine.**
>
> `explicit random_device(const string& token = implementation-defined);`  
>  3 _Effects:_ Constructs a `random_device` non-deterministic uniform random
> number generator object. **The semantics and default value of the token
> parameter are implementation-defined.**
>
> `double entropy() const noexcept;`  
>  5 _Returns:_ If the implementation employs a random number engine, returns
> 0.0. Otherwise, returns an entropy estimate for the random numbers returned
> by `operator()`, in the range `min()` to log2(`max() + 1`).

* * *

追記：「種を固定して」と表現されていますが、`random_device`コンストラクタに与えるのは乱数生成エンジンに対する種(seed)ではなく、処理系に与えるトークン(token)です。本来の意図としては、いくつかの選択肢から乱数生成エンジンを"選ぶ"ためのものです。

