![]() |
1
7
好吧,假设你加了三个数字,再除以三,再加上两个数字,再除以二。你能从中得出平均值吗?
你想要什么?
等于
当然,上面的两行都是溢出的,但是由于除法是分布式的,所以我们可以这样做。
这保证了你不会溢出,因为我把x,y和z乘以小于1的分数。 这是这里的基本点。我不是预先把所有的数除以总数,也不是永远超过溢出量。 所以…如果你一直在向一个累加器中添加,跟踪你添加了多少个数字,并且总是测试下一个数字是否会导致溢出,然后你可以得到部分平均值,然后计算最终的平均值。 不,如果你事先不知道这些值,它不会改变任何东西(前提是你可以在求和的时候计算它们)。 这是一个scala函数。它不是惯用的scala,因此更容易理解:
编辑: 不乘以2和3,我会回到“不支持数据类型”的范围吗?
不,如果你在最后7点跳水,那当然。但在这里,你们要在和的每一步上进行划分。即使在你的真实情况下,重量(
附言:我想知道为什么我要写这个答案,而不是写我的,在那里我可以获得我的代表:-) |
![]() |
2
4
如果你事先知道数值的数目(比如
如果你不知道提前的物品数量,你可能需要更有创造性。但你也可以,循序渐进地去做。说清单是
当然,如果你想要极端的准确度(比如说,超过0.001%的准确度),你可能需要比这更小心一点,否则你就可以了。 |
![]() |
3
3
让
在哪里?
为什么是这样?让
证据是完整的。 从这里可以很明显地看出,如何使用它来递归地计算一个平均值(比如重复地将一个集合分成两部分),或者如何使用它来并行计算一个集合的平均值。
众所周知的在线平均值计算算法就是这种情况的一个特例。这是一个算法,如果
|
![]() |
4
1
跳出框框思考: 用中间值代替。计算起来要容易得多——外面有很多算法(例如,使用队列),你可以经常构造好的参数来解释为什么它对数据集更有意义(不受极端值的影响等),并且你在数值精度上不会有任何问题。它将是快速和高效的。另外,对于大型数据集(听起来像您的数据集),除非分布真的很奇怪,否则平均值和中位数的值将相似。 |
![]() |
5
0
当你把数字分成几组时,你只是除以总数,还是我遗漏了什么? 你写的是
但那只是
所以对于从1到7的数字,一个可能的分组是
|
![]() |
6
0
这可以重复应用,并且无论求和大小是否相等,都是正确的。所以:
有一个明显的尴尬的情况,那就是在序列的末尾有一些非常小的项,这样在满足“除以n不会下溢”的条件之前,值就会用完。在这种情况下,只需丢弃这些值——如果它们对平均值的贡献不能用您的浮点类型表示,那么它尤其小于平均值的精度。所以不管你是否包含这些术语,对结果都没有任何影响。 还有一些不太明显的尴尬情况与个别求和的精度损失有关。例如,值的平均值是多少:
数学上说是1,但浮点算术上说这取决于你把这些项加起来的顺序,在6种可能性中有4种是0,因为(10^100)+1=10^100。但是我认为浮点运算的非交换性是一个与这个问题不同的更普遍的问题。如果对输入进行排序是不可能的,那么我认为有一些事情是可以做到的,即您可以维护许多不同大小的累加器,并将每个新值添加到其中任何一个累加器中,以获得最佳的精度。但我真的不知道。 |
![]() |
7
0
这是另一种方法。你正在从某个来源一个接一个地接收数字,但是你可以在每个步骤中跟踪平均值。
首先,我将写出步骤中的平均值公式。
初始条件:
(索引从零开始)。 第一个方程可以简化为:
我们的想法是,跟踪平均值,当您“接收”序列中的下一个值时,您计算出它与当前平均值的偏移量,并将其平均分配给
显然,即使您在开始时不知道值的总数,这个方法也可以工作。它还有一个额外的优点,就是您随时都知道当前平均值的值。我能想到的一个缺点是,它可能会给开头看到的数字赋予更多的“权重”(不是严格的数学意义上的,而是因为浮点表示)。 最后,如果计算不够仔细,所有这些计算都会遇到浮点“错误”。见 my answer to another question 对于浮点数计算的一些问题以及如何测试潜在问题。
作为测试,我生成
我发现的是:M 一 埃米 二 α×4.6×10 17 ,米 一 埃米 三 α×3×10 15 ,米 二 埃米 三 α×3×10 -15个 . 因此,如果对数字进行排序,那么错误可能不够小。(但请注意,即使是最严重的错误也是10 15 每100000个数字分成1个部分,所以不管怎样都足够好。) |
![]() |
8
0
这里的一些数学解非常好。这是一个简单的技术解决方案。 使用较大的数据类型。这可以分为两种可能性:
这应该提供尽可能多的双精度,并且应该适用于任何数量的32位元素,最多2个
三十二
-1.如果需要更多的元素,则
在效率方面,它应该和这里的任何其他技术一样快或更快,因为它只需要遍历列表一次,只执行一个除法运算(好的,一组除法运算),并且它的大部分工作都是用整数完成的。不过,我没有对它进行优化,而且我很确定,如果必要的话,它可以稍微快一点。放弃递归函数调用和列表索引将是一个很好的开始。再一次,给读者一个练习。该代码旨在易于理解。
我现在已经测试了这段代码,并做了一些小的更正(在
我首先测试了1000组随机长度(范围在1到1000之间),填充了随机整数(范围在0到2之间)。 三十二 - 1)。这些集合我可以通过在它们上运行一个标准的平均值来轻松快速地验证其准确性。
然后我用100
*
大系列,随机长度10
5个
和10
九
. 这些序列的下界和上界也是随机选择的,受到约束,这样序列就可以在32位整数的范围内。对于任何系列,结果都很容易验证,因为
* 好吧,那是个善意的谎言。在大约20或30次成功运行后,我中止了大型系列测试。一系列长度10 九 在我的机器上运行只需要不到一分半钟的时间,所以测试这个程序大约半小时就足以满足我的口味了。 对于感兴趣的人,我的测试代码如下:
|
![]() |
Muhammad Umer · 为什么这个随机数猜谜游戏模拟产生5.8 5 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 6 月前 |
|
D W · Python-将浮点数从2转换为10到100位小数 7 月前 |
![]() |
Bartol · 确定python龟图形中的角度 11 月前 |
|
randomAlgo · 将弹簧设置为相同长度的成本最低 11 月前 |
![]() |
Fyodor · 在C中使用sin和cos计算数学表达式不正确? 1 年前 |
![]() |
Sergio · python中大量数字的乘法 1 年前 |