Является ли реализация gcc `std :: random_device` правильной? - PullRequest
1 голос
/ 21 мая 2019

Реализация gcc из std::random_device кажется мне странной. В частности, строка 137:

  random_device::result_type
  random_device::_M_getval()
  {
#if (defined __i386__ || defined __x86_64__) && defined _GLIBCXX_X86_RDRAND
    if (!_M_file)
      return __x86_rdrand();
#endif

Предположим, что все эти величины определены. Затем, когда я вызываю оператор вызова для экземпляра std::random_device, я получаю результат из инструкции rdrand. Но rdrand не реализует случайное устройство; rdrand - генератор псевдослучайных чисел, ближе к (скажем) твистеру Мерсенна, чем физическому источнику или случайности.

Я бы ожидал здесь вызов rdseed buildin / intrinsic, поскольку rdseed запрашивает схему, которая генерирует случайные числа через тепловой шум . Для меня это больше похоже на «устройство».

Но я не знаю много о генерации случайных чисел; так что мой мыслительный процесс о реализации std::random_device неверен? Почему?

1 Ответ

1 голос
/ 21 мая 2019

std::random_device разрешено использовать псевдослучайный генератор

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

- std::random_device, C ++ Ссылка

Я не могу говорить с решением GCC о реализации random_device таким образом в ситуации, когда этот макрос оценивается как true, но с учетом проверки if(!_M_file) мое предположение состоит в том, что _M_file является ссылкой на то, что представляет собой потенциальный источник энтропии, и что в его отсутствие GCC откатится к обычному псевдослучайному устройству.

...