Matlab和Python之间随机生成数字的精度差异

时间:2015-04-08 08:47:01

标签: python matlab python-2.7 math

我正在使用Python翻译Matlab算法。为了调试它,我不得不重写几个与rand相关的函数,以便在两种语言之间同步种子。尽管随机生成(显然)相同的数字,但我仍然在两个代码之间存在收敛差异。我将错误追溯到我重写的randn()函数,我需要从标准正态分布返回2个数字。下面是Matlab,以及用Box-Müller方法重写的这个randn()函数的Python版本:

Matlab的:

function output = newRandn(input)

output=zeros(input,1);

for i = 1:input
    output(i) = sqrt(-2*log(rand())) * cos(2*pi*rand());
end

的Python:

def newRandn(size):
    x = np.arange(0.0, size)
    for i in xrange(0,size,1):
        x[i] = math.sqrt(-2*math.log(numpy.random.rand())) * math.cos(2*math.pi*numpy.random.rand())
    return x

两个代码都与同一种子同步。在这里,我正在使用

rng('default')
rng(3530723506)

numpy.random.seed(3530723506)

分别为Matlab和python。

从简单的for循环查看两个函数的输出,我发现了一个差异(以粗体显示),在这种情况下,在第21次迭代的第一个数字中的远十进制处:

Matlab的:

  • 1.10773989463900的 091045900353492470458149909973144531 0.16119915478508828332593338927836157381534576416016

的Python:

  • 1.10773989463900的 113250360845995601266622543334960938 0.16119915478508828332593338927836157381534576416016

使用的代码:

rng('default')
rng(3530723506)

for i = 1:50
    temp = newRandn(2);
    fprintf('%d\n     %.50f\n     %.50f\n', i, temp(1), temp(2))
end

并在Python中:

import numpy
import math
numpy.random.seed(3530723506)
for i in xrange(1, 26, 1):
        temp = newRandn(2);
        print i
        print "     %.50f"%temp[0]
        print "     %.50f"%temp[1]

进一步的迭代大多是正确的,但有些数字也包含精度错误,例如这个。我无法理解为什么有些数字是正确的(至少达到显示的精度),而其他数字则没有。 我试着玩pi的精度,(例如创建一个变量mypi = 3.14),但无济于事。在某些情况下,我的算法将使用pi = 3.14在两个版本之间类似地收敛,但是其他种子将失败。 任何帮助,以了解这些精确错误的来源以及如何克服它们将非常感谢!

提前谢谢。

1 个答案:

答案 0 :(得分:0)

看看这里:https://docs.python.org/2/tutorial/floatingpoint.html 由于Matlab没有在Python中实现,因此您可以安全地认为这不是错误。