【问题标题】:Which machines support nondeterministic random_device?哪些机器支持非确定性 random_device?
【发布时间】: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,有必要获得该信息。在几乎任何问题中包含它通常也是有用的信息。

标签: c++ c++11 random entropy


【解决方案1】:

您引用的来源误导了您。 standard 表示

double entropy() const noexcept; 

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

better reference 有一些经验观察

注意事项

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

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

【讨论】:

  • 谢谢卡莱斯。您带来的参考资料说“如果实施限制阻止生成不确定的随机数,则实施可能会使用随机数引擎”。你知道任何这样的“实施限制”吗?如果我的熵总是 0,我怎么知道生成的数字是随机的还是伪随机的?
  • 您查看编译器的文档。不存在不确定性的示例是针对微控制器,这些通常没有硬件源
  • @Manelicus 我相信带有 mingw 的 Windows 上的 GCC 具有确定性 random_device
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2015-02-09
相关资源
最近更新 更多