加速MATLAB中的随机数生成

时间:2016-08-31 13:37:09

标签: performance matlab random vectorization precision

有没有办法生成伪随机数以降低精度,从而加快处理速度?

另一件事是,我知道如果一次性生成随机数(例如rand(100,1000)),而不是逐个生成随机数,则可以节省时间。有人可以解释为什么这是真的吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,a.k.a。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.

答案 2 :(得分: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快两倍。