哪些计算机支持非确定性random_device?
Which machines support nondeterministic random_device?
我需要从不同的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
。您的测试具有非常高的假阴性率。
相关文章:
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 'generate'不是窗口头文件中'std::random_device'的成员<random>
- 数组打印"random"值时出现问题
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 使用""的不可重现的随机数<random>
- <random> 尽管不是常量,但所有发行版都是线程安全的吗?
- 加载安全区图像"A device attached to the system is not functioning"
- 从时间生成'random'数字?
- CMake + CUDA "invalid device function"即使使用正确的 SM 版本
- 无法在 c++ 中包含"random"头文件
- Nemiver 找不到文件 /build/glibc-LK5gWL/glibc-2.23/stdlib/random.c
- 如何在 c++ 中正确读取 GRC 块"Random Source"的字节输出数据到自己的 OOT 块中?
- 如何从C++<random>获得一致的行为
- 为什么 random() 在窗口中不起作用
- 等效于C++中的numpy.random.choice函数
- Arduino 的新手。 "Random"值在复位时重复
- 在 c++ 中反转数组时,为什么在输入和输出之间得到一个"random"数字?
- 如何使用<random>填充标准::数组
- C++ API 中的张量流加载模型并得到"from device: CUDA_ERROR_OUT_OF_MEMORY"错误