4

我想生成大量随机数(均匀分布在区间[0,1]上)。目前,这些随机数的生成导致我的程序运行非常缓慢,但是程序只需要将它们计算到小数点后 5 位左右。

我不完全确定 MATLAB 是如何生成随机数的,但是如果有一种方法可以只将它们计算到小数点后 5 位,那么它将(希望极大地)加快我的程序。

有没有办法做这样的事情?

非常感谢。

4

3 回答 3

2

要回答您的问题,是的,您可以生成单精度随机数,如下所示:

r = rand(..., 'single');  %Reference: http://www.mathworks.com/help/matlab/ref/rand.html

当打印为十进制时,单精度数字有 7 个(ish)有效数字。

为了回应上面的一些评论,我认为这不会给你带来太多的性能。rand如果您的操作真的很慢,那么要做的第一件事就是批量调用。也就是说,而不是:

for ix 1:1000
    y = rand(1,1,'single);
end

采用:

yVector = rand(1000,1,'single');
于 2013-01-07T00:47:23.060 回答
2

如前所述,您可以指示RAND将数字直接生成为单精度,并且绝对最好以合适大小的块生成数字。如果您仍然需要更高的性能,并且您有 Parallel Computing Toolbox 和受支持的 NVIDIA GPU,则该gpuArray.rand功能可以更快,特别是如果您选择这样的 philox 生成器:

parallel.gpu.RandStream('Philox4x32-10')
于 2013-01-07T08:36:45.987 回答
0

假设您实际上有一个正确的代码布局,您可以在数组中生成大量数字,这可能是低精度的解决方案。请注意,我尚未测试,但提到它很快:

R = randi([0 100000],500,300)/100000

这将生成 150000 个介于 0 和 1 之间的低精度随机数

于 2013-01-07T09:03:48.273 回答