Вы можете загрузить libjvm.dylib явно, запустив, как
dyn.load('/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/jre/lib/server/libjvm.dylib')
library(rJava)
Учитывая, что стандарт C ++ только слабо определяет rand()
, вы не можете утверждать, что он эквивалентен функции matlab.
К счастью, C ++ 11 теперь имеет набор генераторов, которые стандартизированы в стандарте включить заголовок <random>
. Например, std::mt19937
является генератором Twers Mersenne, а std::minstd_rand
является линейным конгруэнтным генератором, который позволяет вам настроить коэффициенты последовательности.
Мое предположение заключается в том, что генератор Matlab может быть воспроизведен с помощью этого последнего , Подробные сведения см. В документах Matlab. К счастью, тестирование вашего кода будет тривиальным.
Угадание ванны почти корректно: 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()
, это «нестандартное» поведение, очевидно, не может быть классифицировано как ошибка. Приведенные выше примеры кода учитывают это поведение.