我正在使用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的:
的Python:
使用的代码:
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在两个版本之间类似地收敛,但是其他种子将失败。 任何帮助,以了解这些精确错误的来源以及如何克服它们将非常感谢!
提前谢谢。
答案 0 :(得分:0)
看看这里:https://docs.python.org/2/tutorial/floatingpoint.html 由于Matlab没有在Python中实现,因此您可以安全地认为这不是错误。