Эквивалентная реализация на C ++ функции rng (семя, твистер) MATLAB [дубликат]

Вы можете загрузить libjvm.dylib явно, запустив, как

dyn.load('/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/jre/lib/server/libjvm.dylib')
library(rJava)
1
задан user2396315 13 June 2014 в 07:54
поделиться

2 ответа

Учитывая, что стандарт C ++ только слабо определяет rand(), вы не можете утверждать, что он эквивалентен функции matlab.

К счастью, C ++ 11 теперь имеет набор генераторов, которые стандартизированы в стандарте включить заголовок <random>. Например, std::mt19937 является генератором Twers Mersenne, а std::minstd_rand является линейным конгруэнтным генератором, который позволяет вам настроить коэффициенты последовательности.

Мое предположение заключается в том, что генератор Matlab может быть воспроизведен с помощью этого последнего , Подробные сведения см. В документах Matlab. К счастью, тестирование вашего кода будет тривиальным.

5
ответ дан Bathsheba 4 September 2018 в 08:39
поделиться

Угадание ванны почти корректно: Matlab R2017A использует алгоритм MT19937, а не LC-алгоритм в качестве генератора случайных чисел по умолчанию; источник для rand.m на самом деле включает уведомление об авторском праве от версии Nishimura и Matsumoto MT19937 C программы 2002 года .

В C ++ 11 по умолчанию используется значение 5489, которое идентичен семену по умолчанию Matlab (и по умолчанию в заданной программе C).

Итак, следующий код Matlab:

rng('default');
a = rand();
a = rand();
a = rand();

выдает идентичные значения для Код C ++:

std::mt19937 rng;
std::uniform_real_distribution<float> urd(0, 1);
a = urd(rng);
/* skip alternate values */ rng();
a = urd(rng);
/* skip alternate values */ rng();
a = urd(rng);

Примечание: Чтобы воспроизвести вывод Matlab, используйте std::uniform_real_distribution<float> not std::uniform_real_distribution<double>.

EDIT : Matlab, по-видимому, пропускает каждое другое значение после каждого вызова rand() по сравнению с C ++. Я сравнил вывод Matlab с результатами как MSVC 2017, так и GCC 5.4; оба они ведут себя одинаково друг с другом. Поскольку нет гарантий относительно индивидуальных значений, созданных rand(), это «нестандартное» поведение, очевидно, не может быть классифицировано как ошибка. Приведенные выше примеры кода учитывают это поведение.

1
ответ дан Josh Greifer 4 September 2018 в 08:39
поделиться
Другие вопросы по тегам:

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