使用低精度MATLAB生成随机数

Generating a random number with low precision MATLAB

提问人:Paul Rubenstein 提问时间:1/7/2013 更新时间:1/7/2013 访问量:2098

问:

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

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

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

非常感谢。

MATLAB 随机 精度

评论

7赞 Jonathon Reinhart 1/7/2013
您应该显示您在循环中生成数字的代码,和/或有关如何知道 RNG 减慢程序速度的详细信息。
1赞 Jonas 1/7/2013
我真诚地怀疑低精度的随机数会加速任何事情。但是,一旦在循环之外计算随机数数组可能会加快代码速度。
2赞 KlausCPH 1/7/2013
我同意@Jonas。随机数不是由迭代过程生成的,在迭代过程中,通过进行更多的轮次(例如 sin 和 cos)可以获得更高的精度。它们基于密码学等设计的疯狂算法。可能会有所帮助的一件事是更改兰德种子生成器的方法。不记得它是如何完成的,但搜索兰德文档并介绍不同的类型。
1赞 Jonas 1/7/2013
顺便说一句:您是否运行了分析器并确定随机数生成速度很慢?

答:

2赞 Pursuit 1/7/2013 #1

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

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');

评论

2赞 Edric 1/7/2013
实际上,要求生成只会将全精度结果转换为 。要使生成器仅直接生成,您需要创建一个设置为 的对象。有关详细信息,请参阅 mathworks.com/help/matlab/ref/randstream.htmlRANDsinglesinglesingleRandStreamFullPrecisionfalse
2赞 Edric 1/7/2013 #2

如前所述,您可以指示直接以单精度生成数字,并且最好以适当大小的块生成数字。如果您仍然需要更高的性能,并且您拥有 Parallel Computing Toolbox 和支持的 NVIDIA GPU,则该功能可能会更快,尤其是当您选择 philox 生成器时,如下所示:RANDgpuArray.rand

parallel.gpu.RandStream('Philox4x32-10')
0赞 Dennis Jaheruddin 1/7/2013 #3

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

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

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