哪些计算机支持非确定性random_device?

Which machines support nondeterministic random_device?

本文关键字:random device 确定性 非确定 计算机 支持      更新时间:2023-10-16

我需要从不同的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] 并不意味着 生成伪随机数的引擎,但基于的生成器 随机过程生成均匀分布序列 随机数。虽然,某些库实现可能缺少 能够产生这样的数字并使用随机数引擎 而是生成伪随机值。在这种情况下,熵返回 零。源

检查熵的值允许我中止 de 数据获取,如果结果数据将是伪随机的(不是非确定性的(。请注意,我假设如果rd.entropy() == 0为真,那么我们处于伪随机模式。

不幸的是,由于熵为 0,我的所有试验都会导致一个没有数据的文件。我的问题是:我可以对我的计算机做什么,或者我在哪里可以找到允许我获取数据的机器?

你引用的来源误导了你。该标准说

double entropy() const noexcept; 

返回:如果实现使用随机数引擎,则返回 0.0。否则,返回 operator(( 返回的随机数的熵估计值,范围为 min(( 到 log2(max((+1(。

更好的参考有一些经验观察

笔记

此功能在某些标准库中未完全实现。为 例如,LLVM libc++ 始终返回零,即使设备是 非确定性。相比之下,Microsoft视觉C++实现 总是返回 32,boost.random 返回 10。

在实践中,几乎所有的主要实现(针对通用计算机(都具有非确定性std::random_device。您的测试具有非常高的假阴性率。