假设我有这个跨平台程式

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::cout << "rd.entropy = " << rd.entropy() << std::endl;
    std::uniform_int_distribution<int> dist(0, 9);

    for (int i = 0; i < 10; ++i) {
        std::cout << dist(rd) << " ";
    }
    std::cout << std::endl;
}

在带有g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2的Linux Mint 17.1上,它总是产生随机数:
$ g++ -std=c++11 testrd.cpp -o testrd
$ ./testrd
rd.entropy = 0
9 2 6 0 8 1 0 2 3 8
$ ./testrd
rd.entropy = 0
3 6 2 4 1 1 8 3 7 5
$ ./testrd
rd.entropy = 0
3 4 4 6 8 5 4 6 6 3
$ ./testrd
rd.entropy = 0
2 4 7 7 6 3 0 1 1 9
$ ./testrd
rd.entropy = 0
7 2 5 0 7 8 6 6 0 6

但是,如何确定在任何系统上std::random_device是随机的?例如,在带有mingw-gcc的Windows上,它不是随机的(例如,参见this question),它将在启动时产生相同的序列。但是从2013.4开始,在MSVC++(根据S. Lavavej)上,它是随机的。

我以为我可以做到这一点:
if (rd.entropy() != 0) {
    // initialize some generator like mt19937 with rd()
}
else {
    // use another seed generator (for example, time in milliseconds)
}

即将rd.entropy()与0进行比较。但是事实证明这是错误的。

如何测试std::random_device的随机性?

最佳答案

std::random_device::entropy上的cppreference的页面上(重点是我的)

关于c++ - 如何测试std::random_device的随机性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30125518/

10-15 02:36
查看更多