2016-08-31 3 views
1

Есть ли способ генерировать псевдослучайные числа до меньшей точности и тем самым ускорить процесс?Ускорить генерацию случайных чисел в MATLAB

Другое дело, что я знаю, что это экономит время, если случайно генерируются случайные числа (например, rand(100,1000)), а не один за другим. Может ли кто-нибудь объяснить, почему это так?

+0

В соответствии с [документацией] (http://www.mathworks.com/help/matlab/ref/rand.html) вы можете указать, что результат является «единственным». Без дополнительного контекста о том, что именно вы делаете, трудно ответить на вопрос «почему это медленно»? – excaza

+1

Я думаю, что указание вывода как «одиночного» только изменяет сам вывод. Таким образом, числа вычисляются с той же точностью, что и раньше, и они округляются сразу после этого, что не помогло бы скорости. Не существует конкретной программы, с которой это связано, мне просто интересно, если это вообще возможно. – moon1234

+0

Должна быть * какая-то * программа, которая порождает этот вопрос. Генерация 9 миллионов случайных чисел занимает «0,047 секунды» на моей машине. Это не медленно. – excaza

ответ

2

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. 
4

Если у вас есть CUDA с поддержкой GPU, вы можете сделать random number generation on it, как это должно быть намного быстрее ... Конкретно Philox4x32-10:

parallel.gpu.rng(0, 'Philox4x32-10'); 
R = gpuArray.rand(sZ,'single'); % run this for more info: doc('gpuArray/rand') 

Example from the MATLAB documentation

2

С R2015a rng функция для конфигурирования и посева глобального генератора имеет параметр 'simdTwister', который использует более быстрый алгоритм «SIMD-oriented Fast Mersenne Twister»:

rng(1,'twister'); 
R = rand(1e4); % Warmup for timing 
tic 
R = rand(1e4); 
toc 

rng(1,'simdTwister'); 
R = rand(1e4); % Warmup for timing 
tic 
R = rand(1e4); 
toc 

Это, вероятно, самый быстрый встроенный генератор для вашей системы (за исключением возможности генераторов на основе GPU). На моем компьютере это немного больше, чем в два раза быстрее, чем по умолчанию Mersenne Twister algorithm для больших массивов.