为什么 Excel RANDBETWEEN 数字会因工作表上的任何操作而改变?

为什么 Excel RANDBETWEEN 数字会因工作表上的任何操作而改变?

我需要使用 Microsoft Excel 的 RANDBETWEEN 函数,并且我知道每当您在工作表的任何地方执行任何其他操作时,都会生成一组新的随机数。我还知道“冻结”已生成的一组随机数的变通方法,例如,对 a 和 b 之间的 n 个随机数列表进行排序。我的问题是:为什么生成的随机数会发生变化?算法中是否有某些东西需要这样做?FWIW、Google Sheets、LibreOffice Calc、Apple Numbers 都表现出相同的行为。

答案1

查尔斯·威廉姆斯 (Charles Williams) 对 Excel 如何计算以及为什么计算进行了很好的解释。

http://www.decisionmodels.com/calcsecretsi.htm

本质上,如果工作簿包含易失性函数(请参阅 Charles 的列表,因为易失性函数的含义多年来随着 Excel 版本的不同而发生变化),则当工作簿中的任何单元格发生更改时(如果 Excel 设置为自动计算),将触发整个工作簿的重新计算。如果工作簿中没有易失性函数,则只有受上次更改影响的单元格才会重新计算。

这里的其他人说,当任何单元格更改时,自动计算将始终计算工作簿中的所有内容,但这是错误的。只有易失性函数才会导致工作簿中所有单元格的自动重新计算。如果没有易失性函数,Excel 只会重新计算需要重新计算的内容。

这就是为什么像我这样知道区别的人强烈建议尽可能避免在工作表单元格中使用诸如 OFFSET() 或 INDIRECT() 之类的易变函数,因为它们会在每次单元格更改后导致完全重新计算,从而降低工作簿的速度。学习使用 INDEX() 而不是 OFFSET() 可以显著提高速度,因为 Index 不是易变的(有关更多详细信息,请参阅 Charles 的文章)。

Excel 的计算引擎基于“重新计算或死亡”的理念,这使得 Excel 在开发过程中与竞争产品区别开来。请查看这篇文章:https://www.geekwire.com/2015/recalc-or-die-30-years-later-microsoft-excel-1-0-vets-recount-a-project-that-defied-the-odds/

答案2

其他答案侧重于重新计算的机制和易失性函数的作用,但我认为这忽略了问题的部分要点。它解决​​了已采用的规则,但并未解决“为什么”。我将重点讨论这一点。

设计理念

首先,我要介绍一下设计理念和大多数现代电子表格的构成要素。它们之间存在“责任分工”。函数是执行特定任务的专用例程,每次被要求时都会执行该任务。除此之外,电子表格应用程序控制何时被要求执行这些任务。

函数本身不包含选择重新计算或不重新计算的任何逻辑。所有 Excel 函数的本质都是在触发时执行某种类型的操作。没有函数拥有其当前值的“记忆”,也没有其过去计算的历史记录。它无法知道这是否是第一次被要求执行其工作。因此,没有原生函数能够只运行一次。如果重新计算任何函数,它将执行其设计的任务并产生新的值。

电子表格应用程序确实包含一些智能功能,可以通过跳过不必要的重新计算来节省时间(如 teylyn 的回答中所述)。仅有的如果应用程序知道函数的值不受触发需要重新计算的电子表格更改的影响,则会跳过时间重新计算。

那么,如果您需要让函数运行一次然后保留其值,该怎么办?以生成随机数然后结果不变为例。这描述了创建随机生成的常量,您可以使用 Excel 做到这一点。

Excel 无法知道您想如何使用其功能;您是想继续生成新值还是保留上一组值。每个选项都是 Excel 支持的一个用例。Excel 通过为您提供计算新值的工具和保留旧值的工具来适应这两种情况。您可以构建任何您想要的东西。但用户有责任让它做他们想做的事情。

功能逻辑

那么让我们看看该函数的逻辑。重新计算逻辑是否应该跳过随机函数,因为其值不应受到电子表格中其他更改的影响?

函数值在重新计算时是否会改变取决于其用途和所依据的内容。对常量值的计算将始终产生相同的结果。基于未改变的单元格值的运算将产生相同的结果。

但是,有些函数的设计意图和目的就是每次都产生不同的结果。例如,考虑基于当前时间的函数。它们将根据重新计算的时间产生新的结果。您不能让一个函数的目的是根据当前时间产生一个值,而让它在重新计算时不更新。

重新计算控制的目标是在触发重新计算时始终使所有内容反映事物的当前状态。如果基于当前时间的函数未更新,则无法满足该标准。

“随机”函数(如 RANDBETWEEN)的目的是在重新计算时生成一个新的随机数。这就是它们的目的。您可能会争辩说,可以跳过重新计算,因为该值不应受到电子表格上发生的其他事情的影响。

如果这是默认行为,您将更新电子表格,但随机值将保持不变。这不是非常随机的行为。这将支持一种用例,但不支持另一种用例。回到基本的设计概念,它的处理方式与任何其他函数一样。默认行为是让 Excel 重新计算它。如果您想为您的用例保留以前的值,您可以使用可用的工具来做到这一点。

答案3

工作表中的每个更改都会启动自动重新计算所有公式,这是默认行为。

您可以通过将其转换为纯值(与公式相反)来禁用它或冻结实际值。

答案4

尽管人们竭尽全力让这听起来像是一个功能而不是一个错误,但我发现这种行为不太可能带来好处。“功能”让我们的生活更轻松,“错误”让我们的生活更艰难。就我而言,在未被任何其他单元格引用的单元格中输入标签或说明会导致重新随机化,这很不方便处理。我称之为“错误”。

是的,我可以手动控制重新计算(很麻烦)或者我可以粘贴值来防止它(再次,很麻烦),但是在什么情况下,由在工作表的远程区域输入文本引起的重新随机化会让生活变得更轻松?

即使“易失性”函数的处理背后有一些逻辑,但通过适当的标准触发重新计算似乎很容易,而不是简单地在无关和未引用的单元格中输入文本后按“Enter”,或者通过其他完全不相关的编辑。防止这种情况应该是默认的,我无法想象实现起来会很困难。如果有人想要这个“功能”,那么他们可以打开它,但我无法想象这在什么时候会是一件好事。充其量,它可能相对无害。对我来说,由于我创建的表格类型,这是一个很大的麻烦。

最后 -- 分析工具库允许您以各种方式创建随机数分布,并且这样创建的数字范围根本不会重新计算(重新随机化),除非您告诉它这样做。因此,我建议人们在分析工具库满足其需求时使用它。

相关内容