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

now*_*guy 14 microsoft-excel

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

tey*_*lyn 28

Charles Williams 很好地解释了 Excel 如何计算事物及其原因。

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

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

这里的其他人表示,当任何单元格更改时,自动计算将始终计算工作簿中的所有内容,但这是错误的。只有 volatile 函数会自动重新计算工作簿中的所有单元格。如果没有 volatile 函数,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 -赔率/

  • 当然,如果“易失性函数”定义正确,那么除了速度之外,重新计算所有内容和仅重新计算需要的内容之间应该没有明显的区别。 (3认同)

fix*_*234 12

其他答案侧重于重新计算的机制和 volatile 函数的作用,但我认为这遗漏了问题的部分要点。它解决了已采用的规则,而不是“为什么”。我会专注于此。

设计理念

让我从设计概念和大多数现代电子表格的构建块开始。有一个“责任分工”。函数是执行特定任务的专用例程,并在每次被要求时执行。除此之外,电子表格应用程序控制何时被询问。

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

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

那么,如果您需要让一个函数运行一次然后保留它的值呢?以您生成随机数然后结果不变的示例为例。这描述了创建随机生成的常量,您可以使用 Excel 来实现。

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

功能逻辑

因此,让我们看一下函数执行的逻辑。重新计算逻辑跳过随机函数是否有意义,因为它的值不应受电子表格中其他更改的影响?

函数的值在重新计算时是否发生变化取决于其目的和基于什么。对常数值的计算将始终产生相同的结果。基于未更改的单元格值的操作将产生相同的结果。

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

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

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

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

  • @nowradioguy,你不相信的部分是什么?Excel 以某种方式工作,我们有点被它的功能和设计困住了。根据您的要求,保留结果非常简单,只需要多次完成即可。如果数字在一列中,请一步选择并复制 25 的集合,然后将特殊值粘贴到另一个位置的单元格中。只需点击几下,这可能是最快的方法。粘贴可能会触发重新计算,因此您已准备好重复。你可以在几分钟内做 20 组。然后玩得开心。:-) (3认同)

Mar*_*anD 2

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

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

  • Excel 如何提前知道您是否想要“终身”随机值或者是否想要经常更改它?第二种情况更有可能(因为在相反的情况下,您可以直接在单元格中键入随机值)。 (3认同)