Пример C ++ RNG от S.O. печатает неслучайные числа (на моей машине) [дубликат]

Перезапустите Eclipse и снова проверьте свой манифест. Если вам не хватает соответствующего действия, добавьте его и повторите попытку. Он решил мою аналогичную проблему.

60
задан Peter O. 1 March 2016 в 03:00
поделиться

4 ответа

Из http://en.cppreference.com/w/cpp/numeric/random/random_device :

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

Я ожидал бы достойной реализации, по крайней мере, RNG.

Редактирование: я подозреваю, что они сознательно выбрали выполнение одной и той же последовательности каждый раз, чтобы сделать очевидным тот факт, что поток не был таким случайным, как обещали.

30
ответ дан Mark Ransom 16 August 2018 в 01:17
поделиться
  • 1
    Согласен. Резервная реализация stdlibc ++ использует постоянное семя, которое не поражает меня, как все это умное (и это не объяснено). – Konrad Rudolph 18 September 2013 в 21:00
  • 2
    Реальный отказ состоит в том, чтобы в первую очередь иметь этот псевдослучайный резерв. – ypnos 5 September 2014 в 11:14
  • 3
    @ypnos: стандарт должен сделать что-то, чтобы покрыть случай реализации C ++ на детерминированной платформе. Но делать это на реальной платформе - это огромная проблема с качеством реализации. См. Также . Как лаконично, переносимо и тщательно высевать mt19937 PRNG? . – Peter Cordes 13 July 2017 в 21:15
  • 4
    @PeterCordes отличный ресурс! – ypnos 14 July 2017 в 10:01

Я получил подтвержденный ответ от STL от MSFT :

В отличие от VC, GCC не реализовал random_device недетерминированно в Windows. Boost, поэтому вы можете использовать Boost.Random.

24
ответ дан ahala 16 August 2018 в 01:17
поделиться
  • 1
    Мне еще нужно найти соответствующий документ, указывающий, какие boost -l's и какие повышения порядка -l нужны в gcc, чтобы избежать ошибок ссылок, и любая система -l также требуется. Просто добавление -lboost-random-mgw48-mt-d-1_57 привело к тому, что компоновщик усмотрел отсутствие boost :: random :: random_device () и без boost :: random :: ~ random_device () – Brian Jack 25 September 2015 в 18:45
  1. GCC не реализует rd.entropy () правильно - он всегда возвращает 0 (по крайней мере, в Mac OS X).
  2. К сожалению, похоже, что нет никакой возможности смешать дополнительную энтропию в random_device, что важно, потому что обычно / часто (посмотрите на Linux / dev / random и / dev / urandom, а также на реализацию Intel RDRAND) реализует генератор псевдослучайных чисел под капотом. Я бы хотел улучшить свой результат, введя что-то, что я считаю случайным, чтобы смешиваться с тем, что производит его источник энтропии. Опять же, поскольку это устройство (или модуль ядра) внутренне реализует криптографический алгоритм для обработки битов энтропии, которые он получает для генерации своего вывода, я хотел бы иметь возможность «рандомизировать» этот процесс больше путем инъекции мои собственные данные должны смешиваться с любой энтропией, которую выбирает устройство. Например, рассмотрим Java SecureRandom (). Это не позволяет вам устанавливать семя (которое действительно преобразует его в PRNG), но оно будет радостно смешивать то, что вы предоставляете, тем, что оно использует, чтобы «рандомизировать» свой результат еще больше.
  3. Я лично предпочитают RDRAND. Небольшая сборная библиотека с компактным интерфейсом C. Вот ссылки: Дэвид Джонсон из Intel объясняет RDRAND на Stackoverflow Указатели Stackoverflow для источника библиотеки RDRAND для Windows, Linux и Mac OS X Блог Intel в библиотеке RDRAND , и ссылку для скачивания
2
ответ дан Community 16 August 2018 в 01:17
поделиться
  • 1
    Не имеет смысла посеять random_device. Если для этого требуется семя, то это псевдослучайный генератор, а не истинный генератор случайных чисел, что и должно быть random_device. – Chris Beck 6 November 2015 в 11:42
  • 2
    & Quot; Семя & Quot; был неудачный термин. Вы не "семя" "истина" random_device. Но поскольку случайные устройства, например, предоставляемые Linux (и даже встроенная в RDRAND), включают в себя программные алгоритмы между их источниками энтропии и их доступностью для пользователей, смешение в случайности / энтропии из других источников не может повредить результат, а иногда может Улучши это. Я думаю, вы должны отказаться от своего понижающего голоса, если вы честны. – Mouse 11 April 2016 в 02:13
  • 3
    Я думаю, что ответ путается, если вы перепишете его, тогда я могу отступить от моего понижения. Существует различие между псевдослучайной генерации и извлечения случайности . Теоретически это работает так. Учитывая слабо случайный источник, например, возможно, 1000 бит с только 100 бит энтропии в них, сначала вы хотите использовать экстрактор, чтобы получить ~ 50 бит с ~ 50 бит энтропии в них. На практике это использует криптографическую хэш-функцию. Затем результат может использоваться в качестве семени для генератора, который растягивает 50 бит на многие другие бит для использования в вашем приложении. (Числа составлены.) – Chris Beck 15 April 2016 в 07:23
  • 4
    Ницца. Я не знал, что вы можете написать в /dev/random. Теперь я знаю лучше: добавить файл в качестве источника энтропии и , зачем писать в /dev/random.... XORing дополнительной энтропии в результат является хорошим и эффективным способом - с недостатком явного. – Mouse 7 June 2016 в 09:01
  • 5
    Я думаю, что модель Java является лучшей, поскольку она позволяет остальной программе, которая использует SecureRandom, не знать о всех этих деталях и улучшениях и просто использовать стандартный интерфейс стандартного класса as-is. Еще одним преимуществом API Java SecureRandom является то, что он устойчив к коррупции с помощью «плохого». случайность ввода пользователем. Выход SecureRandom может только улучшать (или оставаться на том же уровне) с дополнительным входом. – Mouse 7 June 2016 в 09:01

Вам может потребоваться передать параметр конструктору:

https://gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/api/a00899.html

3
ответ дан user877329 16 August 2018 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: