Какие машины поддерживают недетерминированное устройство 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] не должен быть
двигатель, который генерирует псевдослучайные числа, но генератор на основе
случайные процессы для генерации последовательности равномерно распределенных
случайные числа. Хотя в некоторых реализациях библиотеки может отсутствовать
способность производить такие числа и использовать механизм случайных чисел для
вместо этого генерировать псевдослучайные значения. В этом случае энтропия возвращается
нуль. Источник

Проверка значения энтропии позволяет мне прервать получение данных, если полученные данные будут псевдослучайными (не недетерминированными). Обратите внимание, что я предполагаю, что если rd.entropy() == 0 верно, то мы в псевдослучайном режиме.

К сожалению, все мои исследования приводят к тому, что файл не содержит данных, так как энтропия равна 0. Мой вопрос: что я могу сделать с моим компьютером или где я могу найти машину, которая позволяет мне получать данные?

3

Решение

Источник, который вы цитируете, вводит вас в заблуждение. стандарт Говорит, что

double entropy() const noexcept;

Возвращает: Если реализация использует механизм случайных чисел, возвращает 0.0. В противном случае возвращает оценку энтропии для случайных чисел, возвращаемых оператором (), в диапазоне от min () до log2 (max () + 1).

И лучшая ссылка имеет некоторые эмпирические наблюдения

Заметки

Эта функция не полностью реализована в некоторых стандартных библиотеках. За
Например, LLVM libc ++ всегда возвращает ноль, даже если устройство
недетерминирована. Для сравнения, реализация Microsoft Visual C ++
всегда возвращает 32, а boost.random возвращает 10.

На практике почти все основные реализации (нацеленные на компьютеры общего назначения) имеют недетерминированный характер. std::random_devices. Ваш тест имеет очень высокий уровень ложных отрицательных результатов.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]