Windows下的random_device

最近在調bug的時候,調了好久,發現時這個隨機數函數出問題。

win10、mingw32-g++、vscode、cmake


random_device()目的就是產生生成真隨機數,rand()函數用的線性同餘法生成隨機數,但是這個隨機數實際上是一個僞隨機數

然而randm_device()只在Linux下有效,在Windows下無效。測試如下:

#include <iostream>
#include <random>



inline float get_random_float()
{
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_real_distribution<float> dist(0.f, 1.f); // distribution in range [1, 6]

    return dist(rng);
}

int main()
{
    int m = 0;
    while(m<10)
    {
        float random_r = get_random_float();

        std::cout<<random_r<<std::endl;

        m++;
    }
    system("pause");
    return 0;
}

同樣的代碼在windows下結果是這樣的:

在linux下結果是這樣的:


爲什麼呢?

random_device()在Linux的實現中,是讀取/dev/urandom設備;Windows的實現是用rand_s。。。很悲劇

那麼是不是因爲windows下的mingw-gcc不好使呢?於是我試了試mscv,結果下:

然後用我的vs2017打開項目,直接生成。 

這個實驗說明,msvc支持真隨機數。over。


附錄

mingw在windows下真的全是坑。我再也不windows下gcc了。。。我選擇msvc。。。

我選擇擁抱Ubuntu


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章