GOOGLE ADS

пятница, 15 апреля 2022 г.

rng('default') для функции rand() в MATLAB vs Octave

У меня есть фрагмент кода Matlab, который генерирует одинаковые случайные числа ( rand(n,1)), когда я инициализирую с помощьюrng('default');

Пример:

>> rng('default');
>> rand(3,1)
ans =
0.8147
0.9058
0.1270

Теперь мне нужно сгенерировать тот же вывод в Octave. Есть ли эквивалентная функция rng('default')в Octave? Посоветуйте, пожалуйста, как получить тот же набор случайных чисел, что и в MATLAB в Octave.


Решение проблемы

Из rand документации для Octave

По умолчанию генератор инициализируется из /dev/urandom, если он доступен, в противном случае — из процессорного времени, времени настенных часов и текущей доли секунды. Обратите внимание, что это отличается от MATLAB, который всегда инициализирует состояние в одно и то же состояние при запуске. Чтобы получить поведение, сравнимое с MATLAB, инициализируйте с детерминированным вектором состояния в файлах запуска Octave (см. «Файлы запуска»).

Чтобы обойти эту разницу, вам нужно будет заполнить как генератор случайных чисел MATLAB, так и генератор случайных чисел Octave, а также указать метод генерации, чтобы попытаться убедиться, что они делают одно и то же. Обратите внимание, что я говорю «попробовать», потому что по сути это разные языки, и нет никакой гарантии эквивалентности.

Однако оказывается, что MATLAB и Octave не используют эквивалентные начальные значения. Пользователь Markuman предоставил пример на вики Octave, чтобы обойти это.

Октава

function ret = twister_seed(SEED=0)
ret = uint32(zeros(625,1));
ret(1) = SEED;
for N = 1:623
## initialize_generator
# bit-xor (right shift by 30 bits)
uint64(1812433253)*uint64(bitxor(ret(N),bitshift(ret(N),-30)))+N; # has to be uint64, otherwise in 4th iteration hit maximum of uint32!
ret(N+1) = uint32(bitand(ans,uint64(intmax('uint32')))); # untempered numbers
endfor
ret(end) = 1;
endfunction
octave:1> rand('twister',twister_seed) # notice: default seed is 0 in the function
octave:2> rand
ans = 0.548813503927325
octave:3> rand
ans = 0.715189366372419
octave:4> rand
ans = 0.602763376071644

МАТЛАБ

>> rand('twister',0)
>> rand
ans =
0.548813503927325
>> rand
ans =
0.715189366372419
>> rand
ans =
0.602763376071644

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

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...