MATLAB фактически реализует более одного генератора случайных чисел. Они значительно отличаются по срокам исполнения и с точки зрения «случайности» (я думаю, но я не проверял). Однако, я понимаю из вашего вопроса, что скорость важнее для вас.
% 'twister' is the default in MATLAB Versions 7.4 and later
tic();
for i=1:1000000
rand('twister');
end
toc();
%Elapsed time is 2.912960 seconds.
% 'state' is the default in MATLAB versions 5 through 7.3
tic();
for i=1:1000000
rand('state');
end
toc();
% Elapsed time is 2.162040 seconds.
% 'seed' is the default in MATLAB version 4
tic();
for i=1:1000000
rand('seed');
end
toc();
% Elapsed time is 0.758830 seconds.
Важное примечание: я побежал сценарий выше с довольно старой версии MATLAB (v.7.6, а.к.а. R2008a). В более новых версиях синтаксис rand(generator)
is discouraged. Вместо этого вы должны использовать функцию rng(seed, generator)
(online documentation). В качестве побочного эффекта rng(seed, generator)
дает вам еще больше генераторов случайных чисел. Подробнее см. Документацию.
Что касается второго вопроса: Какой бы генератор вы ни выбрали, генерирование множества случайных чисел сразу будет быстрее, чем генерация многих одиночных случайных чисел. Это связано с тем, что внутренние элементы MATLAB сильно оптимизированы для параллельной обработки.
tic();
for i=1:100000
rand();
end
toc();
% Elapsed time is 0.024388 seconds.
tic();
rand(100, 1000);
toc();
% Elapsed time is 0.000680 seconds.
В соответствии с [документацией] (http://www.mathworks.com/help/matlab/ref/rand.html) вы можете указать, что результат является «единственным». Без дополнительного контекста о том, что именно вы делаете, трудно ответить на вопрос «почему это медленно»? – excaza
Я думаю, что указание вывода как «одиночного» только изменяет сам вывод. Таким образом, числа вычисляются с той же точностью, что и раньше, и они округляются сразу после этого, что не помогло бы скорости. Не существует конкретной программы, с которой это связано, мне просто интересно, если это вообще возможно. – moon1234
Должна быть * какая-то * программа, которая порождает этот вопрос. Генерация 9 миллионов случайных чисел занимает «0,047 секунды» на моей машине. Это не медленно. – excaza