uniform_real_distribution и uniform_int_distribution производит одинаковые номера, используя g ++ [duplicate]

Могу я просто добавить; люди всегда предполагают, что это компьютерная проблема, но если вы считаете своими руками (база 10), вы не можете получить (1/3+1/3=2/3)=true, если у вас нет бесконечности, чтобы добавить 0.333 ... в 0.333 ... так, как и с (1/10+2/10)!==3/10 в базе 2, вы обрезаете ее до 0,333 + 0,333 = 0,666 и, вероятно, округлите ее до 0,677, что также будет технически неточным.

Подсчитайте в тройном, а третья не проблема, может быть, какая-то гонка с 15 пальцами на каждой руке спросит, почему ваша десятичная математика была сломана ...

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 25 August 2018 в 05:16
поделиться

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

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

24
ответ дан ahala 25 August 2018 в 05:16
поделиться
  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 25 August 2018 в 05:16
поделиться

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

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

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

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