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