【发布时间】:2016-02-16 10:48:14
【问题描述】:
我想问一下Java和Matlab中的随机数。
Java 中的 Math.random 和 Matlab 中的 rand 含义相同还是两者不同?如果不同的意思,有什么区别?
【问题讨论】:
-
他们有可能但不太可能使用相同的公式来生成伪随机数。
我想问一下Java和Matlab中的随机数。
Java 中的 Math.random 和 Matlab 中的 rand 含义相同还是两者不同?如果不同的意思,有什么区别?
【问题讨论】:
对于 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?
【讨论】:
~3 * sqrt(MAX_INT) 时观察到 any 重复构成了强大的 (p > .99) 统计测试的非随机性。给定 32 位整数,这意味着当大多数人认为 ~2B 的完整周期可用时,统计学家可以在 ~200k 值之后发现你。
两者都返回0到1之间均匀分布的伪随机数。生成数字的算法及其质量可能不同,但接口相同。
【讨论】:
MATLAB 中有许多不同的随机数生成器。有关详细信息,请参阅the reference page for rng。串行 MATLAB 中的默认值是 Mersenne Twister(Twister 不是并行随机数生成的合适选择,因此对于 Parallel Computing Toolbox 工作人员,并且在 GPU 上,默认值是组合多重递归)。在 GPU 上,additional random number generators are available 具有高质量且非常适合 GPU 执行。
需要注意的一点:MATLAB 非常小心地进行设置,这样当您开始一个新的 MATLAB 进程时,第一次调用 rand 将始终为您提供相同的结果(对于相同的 MATLAB 版本)。这与 Java 形成鲜明对比,Java 会在您使用 Math.random() 时对种子进行洗牌。
MATLAB 为您提供了多种强大的方法来通过rng 函数和RandStream 对象的方法来控制正在使用的随机数流。
【讨论】: