随机数重新排序的总和组合成重复值

问题描述 投票:0回答:1
g0 = randn(1, 100);
g1 = g0;
g1(2:end) = flip(g1(2:end));
sprintf("%.15e", sum(g0) - sum(g1))
g0 = np.random.randn(100)
g1 = g0.copy()
g1[1:] = g1[1:][::-1]
print(sum(g0) - sum(g1))

在 Python 和 MATLAB 中,重新运行这些命令足够多次将重复以下值(或其负数;不完整列表):

8.881784197001252e-15
3.552713678800501e-15
2.6645352591003757e-15
4.440892098500626e-16
1.7763568394002505e-15

事实上,我第一次和第二次运行它们 -

mat -> py -> mat -> py
- 它们是完全相同,让我认为他们在系统级别上共享 RNG,但有延迟......(但忽略这个问题发生的情况)。

我会比这巧合更快地从地板上摔下来,而且还要跨越不同的语言。

发生什么事了?


Windows

11
、Python
3.11.4
、numpy
1.24.4
、MATLAB
9.14.0.2286388 (R2023a) Update 3

python numpy matlab random precision
1个回答
1
投票

您的价值观:

8.881784197001252e-15
3.552713678800501e-15
2.6645352591003757e-15
4.440892098500626e-16
1.7763568394002505e-15

比赛

>> [40,16,12,2,8].' * eps

ans =

   1.0e-14 *

   0.888178419700125
   0.355271367880050
   0.266453525910038
   0.044408920985006
   0.177635683940025

完全可以预料到您会在此范围内得到舍入误差。在两个不同的系统中获得完全相同的两个值并不是那么巧合。这是偶然发生的。

另请注意,MATLAB 最近更改了

sum
的实现,显式地减少舍入误差:https://blogs.mathworks.com/loren/2021/09/07/a-faster-and-more-accurate-sum /

© www.soinside.com 2019 - 2024. All rights reserved.