最近在調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