最近在调bug的时候,调了好久,发现时这个随机数函数出问题。
win10、mingw32-g++、vscode、cmake
random_device()目的就是产生生成真随机数,rand()函数用的线性同余法生成随机数,但是这个随机数实际上是一个伪随机数。
然而randm_device()只在Linux下有效,在Windows下无效。测试如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #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