Почему повторный запуск простого фрагмента, генерирующего псевдослучайные числа, всегда дает одинаковые результаты? [Дубликат]

Вы пытались решить проблему с клейкой лентой?

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

 if( (n * 0.1) < 100.0 ) { return n * 0.1 - 0.000000000000001 ;}
                    else { return n * 0.1 + 0.000000000000001 ;}    

У меня была такая же проблема в проекте научной симуляции в c #, и я могу сказать вам, что если вы проигнорируете эффект бабочки, он превратится в большого толстого дракона и укусит вас в a **

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 24 August 2018 в 03:34
поделиться

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

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

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

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

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

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

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