这可能是一个奇怪的问题,但是请听我说:
我有一个数值模拟程序。它不是特别长的程序,但是解释起来有点长。我运行这个模拟程序一千次,并计算平均结果和方差,方差非常小,大约为10^(-30)。
然而,我注意到当我在Python 3.3中运行程序时会出现奇怪的情况。在Python 2.7和Python 3.2中,每次都得到相同的答案。相同的平均值,相同的微小方差。
但是当我在Python 3.3中运行时,每次都会得到不同的答案。也就是说,不同的平均值和不同(但仍然很小)的方差。这非常奇怪,因为概率定律表明,如果方差实际上很小,那么这种情况是不可能发生的。所以我想知道,自从3.2以来,在3.3解释器中发生了什么变化,导致我的模拟程序出现问题?
以下是我想到的一些事情:
我有一个数值模拟程序。它不是特别长的程序,但是解释起来有点长。我运行这个模拟程序一千次,并计算平均结果和方差,方差非常小,大约为10^(-30)。
然而,我注意到当我在Python 3.3中运行程序时会出现奇怪的情况。在Python 2.7和Python 3.2中,每次都得到相同的答案。相同的平均值,相同的微小方差。
但是当我在Python 3.3中运行时,每次都会得到不同的答案。也就是说,不同的平均值和不同(但仍然很小)的方差。这非常奇怪,因为概率定律表明,如果方差实际上很小,那么这种情况是不可能发生的。所以我想知道,自从3.2以来,在3.3解释器中发生了什么变化,导致我的模拟程序出现问题?
以下是我想到的一些事情:
- 我可能在Python版本的32位/64位之间存在奇怪的差异,但是我检查过了,它们都在64位上运行。
- 我可能在浮点/整数转换中出现了一些错误,但是在Python 3.2中会处理这个问题,因为他们使除法在适当时返回浮点数,所以3.2和3.3的结果应该是相同的。
- 我的模拟程序被表示为生成器,因此可能在3.3中与生成器有关的某些内容发生了变化,但我无法确定具体变化。
- 有一些我不知道的数值浮点表示方式的变化。
- 有一些函数的底层变化导致了算法的初始条件受到影响。例如,在我的代码中,我使用“list(table.keys())”对最初是字典的数据列进行排序,从3.2到3.3,list决定如何对字典键进行排序可能发生了变化。但如果是这种情况,那么代码每次都应该执行相同的操作,但它没有(故意使列表的排序随机似乎非常奇怪!)。