【发布时间】:2018-05-09 01:28:19
【问题描述】:
我需要从不同的 C++ 随机数生成算法中获取数据,为此我创建了一些程序。其中一些使用伪随机数生成器,另一些使用random_device(非确定性随机数生成器)。以下程序属于第二组:
#include <iostream>
#include <vector>
#include <cmath>
#include <random>
using namespace std;
const int N = 5000;
const int M = 1000000;
const int VALS = 2;
const int ESP = M / VALS;
int main() {
for (int i = 0; i < N; ++i) {
random_device rd;
if (rd.entropy() == 0) {
cout << "No support for nondeterministic RNG." << endl;
break;
} else {
mt19937 gen(rd());
uniform_int_distribution<int> distrib(0, 1);
vector<int> hist(VALS, 0);
for (int j = 0; j < M; ++j) ++hist[distrib(gen)];
int Y = 0;
for (int j = 0; j < VALS; ++j) Y += abs(hist[j] - ESP);
cout << Y << endl;
}
}
}
正如您在代码中看到的,我检查熵是否大于 0。我这样做是因为:
与其他标准生成器不同,这个 [
random_device] 并不意味着 生成伪随机数的引擎,但是基于 生成一系列均匀分布的随机过程 随机数。虽然,某些库实现可能缺少 产生此类数字并使用随机数引擎的能力 而是生成伪随机值。在这种情况下,熵返回 零。 Source
如果结果数据将是伪随机的(不是不确定的),检查熵的值可以让我中止数据获取。请注意,我假设如果rd.entropy() == 0 为真,那么我们处于伪随机模式。
不幸的是,由于熵为 0,我所有的试验都导致文件没有数据。我的问题是:我可以对我的计算机做什么,或者我在哪里可以找到一台可以让我获取数据的机器?
【问题讨论】:
-
您使用的是什么编译器和运行时库?在什么操作系统上?在什么硬件上?
-
您可以尝试不同的工具链。例如。 rextester.com/GHJZY51093 而不是 rextester.com/PVS72980
-
@JesperJuhl 确实与我的问题无关,但如果您需要知道,我可以告诉您。还是谢谢。
-
@Bob__ 喜欢它。谢谢。
-
这很重要,因为
std::random_device是否具有不确定性取决于您的硬件、在其上运行的操作系统、您使用的标准库和您使用的编译器。因此,要回答您是否有不确定的random_device,有必要获得该信息。在几乎任何问题中包含它通常也是有用的信息。