我想问一下Java和Matlab中的随机数。
Java中的Math.random和Matlab中的rand具有相同的含义或两者不同?如果意义不同,有什么区别?
答案 0 :(得分:6)
对于Matlab,请参考http://www.mathworks.com/company/newsletters/news_notes/pdf/Cleve.pdf,它解释了乘法同余生成器如何在Matlab中工作。
对于Java,请参阅http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml#.VsMAw3WLSkA,它解释了线性同余生成器如何在Java Utils类中生成随机数。
两者基本上是相同的算法,其中Matlab的MCG是LCG的特例,请参见此处:https://en.wikipedia.org/wiki/Linear_congruential_generator
是的,C ++(Borland),Java.Utils,Matlab语言使用基本相同的算法,因为它是有效的 - 它具有极高的内存效率,它具有平坦的线性分布(即伪随机) - >但由于序列相关性,它是一种质量差的伪随机数。
但是有更好的算法,不同的算法,以Python为例,使用Mersenne Twister算法作为其PRNG,但感知结果的随机性要小得多,请阅读:Random is barely random at all?
答案 1 :(得分:2)
两者都返回0到1之间均匀分布的伪随机数。生成数字及其质量的算法可能不同,但界面是相同的。
答案 2 :(得分:2)
MATLAB中有许多不同的随机数生成器。有关完整详细信息,请参阅the reference page for rng
。串行MATLAB中的默认值是Mersenne Twister(Twister不适合并行随机数生成,因此对于Parallel Computing Toolbox工作者,在GPU上,默认为Combined Multiple Recursive)。在GPU上,additional random number generators are available具有高质量且非常适合GPU执行。
需要注意的一点是:MATLAB非常谨慎地设置,以便在开始新的MATLAB过程时,rand
的第一次调用将始终为您提供相同的结果(对于同一版本的MATLAB)。这与Java形成对比,如果您使用Math.random()
,则会对种子进行混洗。
MATLAB为您提供了多种强大的方法来通过rng
函数和RandStream
对象的方法来控制使用的随机数流。