加速 MATLAB 中的随机数生成

Speed up random number generation in MATLAB

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

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

MATLAB 实际上实现了不止一个 运行dom 数字生成器。它们在执行时间和 "randomness" 方面有很大差异(我认为,但我没有验证)。但是,我从你的问题中了解到,速度对你来说更重要。

% '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 . Instead, you should use the function rng(seed, generator) (online documentation)。作为副作用,rng(seed, generator) 为您提供了更多 运行dom 数字生成器供您选择。查看文档了解详情。

关于第二个问题:无论您选择哪种生成器,一次生成多个 运行dom 数字总是比生成多个单个 运行dom 更快数字。这是因为 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.

如果你有一个支持 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')

自 R2015a 起 rng function for configuring and seeding the global generator has a 'simdTwister' option that uses a faster "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 快两倍多一点。