加速 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 快两倍多一点。
有没有办法生成精度较低的伪随机数,从而加快处理速度?
另一件事是,我知道如果一次性生成所有随机数(例如 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 快两倍多一点。