Какие машины поддерживают недетерминированное случайное устройство? - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно получить данные из разных алгоритмов генерации случайных чисел в 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. Мой вопрос: что я могу сделать с моим компьютером или где я могу найти машину, которая позволяет мне получать данные?

1 Ответ

0 голосов
/ 09 мая 2018

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

double entropy() const noexcept; 

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

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

Примечания

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

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

...