Мне нужно получить данные из разных алгоритмов генерации случайных чисел 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
] не должен быть
двигатель, который генерирует псевдослучайные числа, но генератор на основе
случайные процессы для генерации последовательности равномерно распределенных
случайные числа. Хотя в некоторых реализациях библиотеки может отсутствовать
способность производить такие числа и использовать механизм случайных чисел для
вместо этого генерировать псевдослучайные значения. В этом случае энтропия возвращается
нуль. Источник
Проверка значения энтропии позволяет мне прервать получение данных, если полученные данные будут псевдослучайными (не недетерминированными). Обратите внимание, что я предполагаю, что если rd.entropy() == 0
верно, то мы в псевдослучайном режиме.
К сожалению, все мои исследования приводят к тому, что файл не содержит данных, так как энтропия равна 0. Мой вопрос: что я могу сделать с моим компьютером или где я могу найти машину, которая позволяет мне получать данные?
Источник, который вы цитируете, вводит вас в заблуждение. стандарт Говорит, что
double entropy() const noexcept;
Возвращает: Если реализация использует механизм случайных чисел, возвращает 0.0. В противном случае возвращает оценку энтропии для случайных чисел, возвращаемых оператором (), в диапазоне от min () до log2 (max () + 1).
И лучшая ссылка имеет некоторые эмпирические наблюдения
Заметки
Эта функция не полностью реализована в некоторых стандартных библиотеках. За
Например, LLVM libc ++ всегда возвращает ноль, даже если устройство
недетерминирована. Для сравнения, реализация Microsoft Visual C ++
всегда возвращает 32, а boost.random возвращает 10.
На практике почти все основные реализации (нацеленные на компьютеры общего назначения) имеют недетерминированный характер. std::random_device
s. Ваш тест имеет очень высокий уровень ложных отрицательных результатов.
Других решений пока нет …